﻿using System.Collections.Generic;

namespace Vanara.PInvoke;

public static partial class User32
{
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
	public const int CCHILDREN_SCROLLBAR = 5;
	public const int CCHILDREN_TITLEBAR = 5;
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member

	/// <summary>
	/// Pass this value to the x, y, nWidth and nHeight parameteres of <see cref="CreateWindow"/> and <c>CreateWindowEx</c> to
	/// select the default position for the parameter.
	/// </summary>
	public const int CW_USEDEFAULT = unchecked((int)0x80000000);

	/// <summary>
	/// An application-defined callback function used with the <c>EnumChildWindows</c> function. It receives the child window handles.
	/// The <c>WNDENUMPROC</c> type defines a pointer to this callback function. EnumChildProc is a placeholder for the
	/// application-defined function name.
	/// </summary>
	/// <param name="hwnd">A handle to a child window of the parent window specified in <c>EnumChildWindows</c>.</param>
	/// <param name="lParam">The application-defined value given in <c>EnumChildWindows</c>.</param>
	/// <returns>To continue enumeration, the callback function must return <c>TRUE</c>; to stop enumeration, it must return <c>FALSE</c>.</returns>
	// BOOL CALLBACK EnumChildProc( _In_ HWND hwnd, _In_ LPARAM lParam); https://msdn.microsoft.com/en-us/library/windows/desktop/ms633493(v=vs.85).aspx
	[PInvokeData("Winuser.h", MSDNShortId = "ms633493")]
	[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Auto)]
	[return: MarshalAs(UnmanagedType.Bool)]
	public delegate bool EnumWindowsProc([In] HWND hwnd, [In] IntPtr lParam);

	/// <summary>
	/// <para>
	/// An application-defined function that processes messages sent to a window. The <c>WNDPROC</c> type defines a pointer to this
	/// callback function.
	/// </para>
	/// <para>WindowProc is a placeholder for the application-defined function name.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="uMsg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message.</para>
	/// <para>For lists of the system-provided messages, see System-Defined Messages.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message information. The contents of this parameter depend on the value of the uMsg parameter.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message information. The contents of this parameter depend on the value of the uMsg parameter.</para>
	/// </param>
	/// <returns>
	/// <para>Type:</para>
	/// <para>The return value is the result of the message processing and depends on the message sent.</para>
	/// </returns>
	// LRESULT CALLBACK WindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam); https://msdn.microsoft.com/en-us/library/windows/desktop/ms633573(v=vs.85).aspx
	[PInvokeData("Winuser.h", MSDNShortId = "ms633573")]
	[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Auto)]
	public delegate IntPtr WindowProc([In] HWND hwnd, [In] uint uMsg, [In] IntPtr wParam, [In] IntPtr lParam);

	/// <summary>
	/// <para>The user-provided entry point for a graphical Windows-based application.</para>
	/// <para><c>WinMain</c> is the conventional name used for the application entry point. For more information, see Remarks.</para>
	/// </summary>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>A handle to the current instance of the application.</para>
	/// </param>
	/// <param name="hPrevInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>
	/// A handle to the previous instance of the application. This parameter is always <c>NULL</c>. If you need to detect whether another
	/// instance already exists, create a uniquely named mutex using the <c>CreateMutex</c> function. <c>CreateMutex</c> will succeed
	/// even if the mutex already exists, but the function will return <c>ERROR_ALREADY_EXISTS</c>. This indicates that another instance
	/// of your application exists, because it created the mutex first. However, a malicious user can create this mutex before you do and
	/// prevent your application from starting. To prevent this situation, create a randomly named mutex and store the name so that it
	/// can only be obtained by an authorized user. Alternatively, you can use a file for this purpose. To limit your application to one
	/// instance per user, create a locked file in the user's profile directory.
	/// </para>
	/// </param>
	/// <param name="lpCmdLine">
	/// <para>Type: <c>LPSTR</c></para>
	/// <para>
	/// The command line for the application, excluding the program name. To retrieve the entire command line, use the
	/// <c>GetCommandLine</c> function.
	/// </para>
	/// </param>
	/// <param name="nCmdShow">
	/// <para>Type: <c>int</c></para>
	/// <para>Controls how the window is to be shown. This parameter can be one of the following values.</para>
	/// <para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>SW_HIDE0</term>
	/// <term>Hides the window and activates another window.</term>
	/// </item>
	/// <item>
	/// <term>SW_MAXIMIZE3</term>
	/// <term>Maximizes the specified window.</term>
	/// </item>
	/// <item>
	/// <term>SW_MINIMIZE6</term>
	/// <term>Minimizes the specified window and activates the next top-level window in the Z order.</term>
	/// </item>
	/// <item>
	/// <term>SW_RESTORE9</term>
	/// <term>
	/// Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and
	/// position. An application should specify this flag when restoring a minimized window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOW5</term>
	/// <term>Activates the window and displays it in its current size and position.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMAXIMIZED3</term>
	/// <term>Activates the window and displays it as a maximized window.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMINIMIZED2</term>
	/// <term>Activates the window and displays it as a minimized window.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMINNOACTIVE7</term>
	/// <term>Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNA8</term>
	/// <term>Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNOACTIVATE4</term>
	/// <term>
	/// Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not activated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNORMAL1</term>
	/// <term>
	/// Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and
	/// position. An application should specify this flag when displaying the window for the first time.
	/// </term>
	/// </item>
	/// </list>
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type:</para>
	/// <para>
	/// If the function succeeds, terminating when it receives a <c>WM_QUIT</c> message, it should return the exit value contained in
	/// that message's wParam parameter. If the function terminates before entering the message loop, it should return zero.
	/// </para>
	/// </returns>
	// int CALLBACK WinMain( _In_ HINSTANCE hInstance, _In_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow); https://msdn.microsoft.com/en-us/library/windows/desktop/ms633559(v=vs.85).aspx
	[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Auto)]
	[PInvokeData("Winbase.h", MSDNShortId = "ms633559")]
	public delegate int WinMain([In] HINSTANCE hInstance, [In] HINSTANCE hPrevInstance, [In][MarshalAs(UnmanagedType.LPStr)] string lpCmdLine, [In] ShowWindowCommand nCmdShow);

	/// <summary>
	/// The type of animation. Note that, by default, these flags take effect when showing a window. To take effect when hiding a window,
	/// use <c>AW_HIDE</c> and a logical OR operator with the appropriate flags.
	/// </summary>
	[Flags]
	public enum AnimateWindowFlags
	{
		/// <summary>Activates the window. Do not use this value with AW_HIDE.</summary>
		AW_ACTIVATE = 0x00020000,

		/// <summary>Uses a fade effect. This flag can be used only if hwnd is a top-level window.</summary>
		AW_BLEND = 0x00080000,

		/// <summary>
		/// Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. The various
		/// direction flags have no effect.
		/// </summary>
		AW_CENTER = 0x00000010,

		/// <summary>Hides the window. By default, the window is shown.</summary>
		AW_HIDE = 0x00010000,

		/// <summary>
		/// Animates the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with
		/// AW_CENTER or AW_BLEND.
		/// </summary>
		AW_HOR_POSITIVE = 0x00000001,

		/// <summary>
		/// Animates the window from right to left. This flag can be used with roll or slide animation. It is ignored when used with
		/// AW_CENTER or AW_BLEND.
		/// </summary>
		AW_HOR_NEGATIVE = 0x00000002,

		/// <summary>Uses slide animation. By default, roll animation is used. This flag is ignored when used with AW_CENTER.</summary>
		AW_SLIDE = 0x00040000,

		/// <summary>
		/// Animates the window from top to bottom. This flag can be used with roll or slide animation. It is ignored when used with
		/// AW_CENTER or AW_BLEND.
		/// </summary>
		AW_VER_POSITIVE = 0x00000004,

		/// <summary>
		/// Animates the window from bottom to top. This flag can be used with roll or slide animation. It is ignored when used with
		/// AW_CENTER or AW_BLEND.
		/// </summary>
		AW_VER_NEGATIVE = 0x00000008,
	}

	/// <summary>For use with ChildWindowFromPointEx</summary>
	[PInvokeData("winuser.h", MSDNShortId = "childwindowfrompointex")]
	[Flags]
	public enum ChildWindowSkipOptions
	{
		/// <summary>Does not skip any child windows</summary>
		CWP_ALL = 0x0000,

		/// <summary>Skips invisible child windows</summary>
		CWP_SKIPINVISIBLE = 0x0001,

		/// <summary>Skips disabled child windows</summary>
		CWP_SKIPDISABLED = 0x0002,

		/// <summary>Skips transparent child windows</summary>
		CWP_SKIPTRANSPARENT = 0x0004
	}

	/// <summary>The default process layout.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "setprocessdefaultlayout")]
	public enum DefaultLayout : uint
	{
		/// <summary>Sets the default horizontal layout to be left to right.</summary>
		LAYOUT_LTR = 0,

		/// <summary>Sets the default horizontal layout to be right to left.</summary>
		LAYOUT_RTL = 1,
	}

	/// <summary>
	/// <para>Specifies the visual feedback associated with an event.</para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ne-winuser-tagfeedback_type typedef enum tagFEEDBACK_TYPE {
	// FEEDBACK_TOUCH_CONTACTVISUALIZATION, FEEDBACK_PEN_BARRELVISUALIZATION, FEEDBACK_PEN_TAP, FEEDBACK_PEN_DOUBLETAP,
	// FEEDBACK_PEN_PRESSANDHOLD, FEEDBACK_PEN_RIGHTTAP, FEEDBACK_TOUCH_TAP, FEEDBACK_TOUCH_DOUBLETAP, FEEDBACK_TOUCH_PRESSANDHOLD,
	// FEEDBACK_TOUCH_RIGHTTAP, FEEDBACK_GESTURE_PRESSANDTAP, FEEDBACK_MAX } FEEDBACK_TYPE;
	[PInvokeData("winuser.h", MSDNShortId = "EEA3024E-D38C-4F4D-A63C-58ECB2B87F20")]
	public enum FEEDBACK_TYPE : uint
	{
		/// <summary>Feedback for a touch contact event.</summary>
		FEEDBACK_TOUCH_CONTACTVISUALIZATION = 1,

		/// <summary>Feedback for a pen barrel-button event.</summary>
		FEEDBACK_PEN_BARRELVISUALIZATION,

		/// <summary>Feedback for a pen tap event.</summary>
		FEEDBACK_PEN_TAP,

		/// <summary>Feedback for a pen double-tap event.</summary>
		FEEDBACK_PEN_DOUBLETAP,

		/// <summary>Feedback for a pen press-and-hold event.</summary>
		FEEDBACK_PEN_PRESSANDHOLD,

		/// <summary>Feedback for a pen right-tap event.</summary>
		FEEDBACK_PEN_RIGHTTAP,

		/// <summary>Feedback for a touch tap event.</summary>
		FEEDBACK_TOUCH_TAP,

		/// <summary>Feedback for a touch double-tap event.</summary>
		FEEDBACK_TOUCH_DOUBLETAP,

		/// <summary>Feedback for a touch press-and-hold event.</summary>
		FEEDBACK_TOUCH_PRESSANDHOLD,

		/// <summary>Feedback for a touch right-tap event.</summary>
		FEEDBACK_TOUCH_RIGHTTAP,

		/// <summary>Feedback for a press-and-tap gesture.</summary>
		FEEDBACK_GESTURE_PRESSANDTAP,

		/// <summary>Do not use.</summary>
		FEEDBACK_MAX = uint.MaxValue,
	}

	/// <summary>The flash status.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "b16636bc-fa77-4eb9-9801-dc2cdf0556e5")]
	[Flags]
	public enum FLASHW
	{
		/// <summary>
		/// Flash both the window caption and taskbar button. This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.
		/// </summary>
		FLASHW_ALL = 0x00000003,

		/// <summary>Flash the window caption.</summary>
		FLASHW_CAPTION = 0x00000001,

		/// <summary>Stop flashing. The system restores the window to its original state.</summary>
		FLASHW_STOP = 0,

		/// <summary>Flash continuously, until the FLASHW_STOP flag is set.</summary>
		FLASHW_TIMER = 0x00000004,

		/// <summary>Flash continuously until the window comes to the foreground.</summary>
		FLASHW_TIMERNOFG = 0x0000000C,

		/// <summary>Flash the taskbar button.</summary>
		FLASHW_TRAY = 0x00000002,
	}

	/// <summary>
	/// To retrieve any other value from the WNDCLASSEX structure using <see cref="GetClassLong(HWND, int)"/>, specify one of the
	/// following values.
	/// </summary>
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.GetClassLongW")]
	public enum GetClassLongFlag
	{
		/// <summary>Retrieves the address of the menu name string. The string identifies the menu resource associated with the class.</summary>
		GCLP_MENUNAME = -8,

		/// <summary>Retrieves a handle to the background brush associated with the class.</summary>
		GCLP_HBRBACKGROUND = -10,

		/// <summary>Retrieves a handle to the cursor associated with the class.</summary>
		GCLP_HCURSOR = -12,

		/// <summary>Retrieves a handle to the icon associated with the class.</summary>
		GCLP_HICON = -14,

		/// <summary>Retrieves a handle to the module that registered the class.</summary>
		GCLP_HMODULE = -16,

		/// <summary>
		/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
		/// CallWindowProc function to call the window procedure.
		/// </summary>
		GCLP_WNDPROC = -24,

		/// <summary>Retrieves a handle to the small icon associated with the class.</summary>
		GCLP_HICONSM = -34,

		/// <summary>
		/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClass or
		/// RegisterClassEx function returns.
		/// </summary>
		GCW_ATOM = -32,

		/// <summary>Retrieves the address of the menu name string. The string identifies the menu resource associated with the class.</summary>
		GCL_MENUNAME = -8,

		/// <summary>Retrieves a handle to the background brush associated with the class.</summary>
		GCL_HBRBACKGROUND = -10,

		/// <summary>Retrieves a handle to the cursor associated with the class.</summary>
		GCL_HCURSOR = -12,

		/// <summary>Retrieves a handle to the icon associated with the class.</summary>
		GCL_HICON = -14,

		/// <summary>Retrieves a handle to the module that registered the class.</summary>
		GCL_HMODULE = -16,

		/// <summary>
		/// Retrieves the size, in bytes, of the extra window memory associated with each window in the class. For information on how to
		/// access this memory, see GetWindowLong.
		/// </summary>
		GCL_CBWNDEXTRA = -18,

		/// <summary>Retrieves the size, in bytes, of the extra memory associated with the class.</summary>
		GCL_CBCLSEXTRA = -20,

		/// <summary>
		/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
		/// CallWindowProc function to call the window procedure.
		/// </summary>
		GCL_WNDPROC = -24,

		/// <summary>Retrieves the window-class style bits.</summary>
		GCL_STYLE = -26,

		/// <summary>Retrieves a handle to the small icon associated with the class.</summary>
		GCL_HICONSM = -34,
	}

	/// <summary>Values used by <see cref="GetWindowLong"/> to determine which value to retrieve.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.GetClassWord")]
	public enum GCW
	{
		/// <summary>
		/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClass or
		/// RegisterClassEx function returns.
		/// </summary>
		GCW_ATOM = -32,
	}

	/// <summary>The ancestor to be retrieved.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "getancestor")]
	public enum GetAncestorFlag
	{
		/// <summary>Retrieves the parent window. This does not include the owner, as it does with the GetParent function.</summary>
		GA_PARENT = 1,

		/// <summary>Retrieves the root window by walking the chain of parent windows.</summary>
		GA_ROOT = 2,

		/// <summary>Retrieves the owned root window by walking the chain of parent and owner windows returned by GetParent.</summary>
		GA_ROOTOWNER = 3
	}

	/// <summary>The relationship between the specified window and the window whose handle is to be retrieved.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "getwindow")]
	public enum GetWindowCmd
	{
		/// <summary>
		/// The retrieved handle identifies the child window at the top of the Z order, if the specified window is a parent window;
		/// otherwise, the retrieved handle is NULL. The function examines only child windows of the specified window. It does not
		/// examine descendant windows.
		/// </summary>
		GW_CHILD = 5,

		/// <summary>
		/// The retrieved handle identifies the enabled popup window owned by the specified window (the search uses the first such window
		/// found using GW_HWNDNEXT); otherwise, if there are no enabled popup windows, the retrieved handle is that of the specified window.
		/// </summary>
		GW_ENABLEDPOPUP = 6,

		/// <summary>
		/// The retrieved handle identifies the window of the same type that is highest in the Z order. If the specified window is a
		/// topmost window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies
		/// a top-level window. If the specified window is a child window, the handle identifies a sibling window.
		/// </summary>
		GW_HWNDFIRST = 0,

		/// <summary>
		/// The retrieved handle identifies the window of the same type that is lowest in the Z order. If the specified window is a
		/// topmost window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies
		/// a top-level window. If the specified window is a child window, the handle identifies a sibling window.
		/// </summary>
		GW_HWNDLAST = 1,

		/// <summary>
		/// The retrieved handle identifies the window below the specified window in the Z order. If the specified window is a topmost
		/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a
		/// top-level window. If the specified window is a child window, the handle identifies a sibling window.
		/// </summary>
		GW_HWNDNEXT = 2,

		/// <summary>
		/// The retrieved handle identifies the window above the specified window in the Z order. If the specified window is a topmost
		/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a
		/// top-level window. If the specified window is a child window, the handle identifies a sibling window.
		/// </summary>
		GW_HWNDPREV = 3,

		/// <summary>
		/// The retrieved handle identifies the specified window's owner window, if any. For more information, see Owned Windows.
		/// </summary>
		GW_OWNER = 4,
	}

	/// <summary>The thread state.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "guithreadinfo")]
	[Flags]
	public enum GUIThreadInfoFlags
	{
		/// <summary>The caret's blink state. This bit is set if the caret is visible.</summary>
		GUI_CARETBLINKING = 0x00000001,

		/// <summary>The thread's menu state. This bit is set if the thread is in menu mode.</summary>
		GUI_INMENUMODE = 0x00000004,

		/// <summary>The thread's move state. This bit is set if the thread is in a move or size loop.</summary>
		GUI_INMOVESIZE = 0x00000002,

		/// <summary>The thread's pop-up menu state. This bit is set if the thread has an active pop-up menu.</summary>
		GUI_POPUPMENUMODE = 0x00000010,

		/// <summary>The thread's system menu state. This bit is set if the thread is in a system menu mode.</summary>
		GUI_SYSTEMMENUMODE = 0x00000008,
	}

	/// <summary>Flags for <see cref="GetWindowFeedbackSetting"/>.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "a40806b3-9085-42b6-9a87-95be0d1669c6")]
	[Flags]
	public enum GWFS
	{
		/// <summary>Check the parent window chain until a value is found</summary>
		GWFS_INCLUDE_ANCESTORS = 0x00000001,
	}

	/// <summary>A layering flag.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "getlayeredwindowattributes")]
	[Flags]
	public enum LayeredWindowAttributes : uint
	{
		/// <summary>Use pbAlpha to determine the opacity of the layered window.</summary>
		LWA_ALPHA = 0x02,

		/// <summary>Use pcrKey as the transparency color.</summary>
		LWA_COLORKEY = 0x01,
	}

	/// <summary>Specifies whether to enable or disable calls to SetForegroundWindow.</summary>
	[PInvokeData("winuser.h")]
	public enum LSFW
	{
		/// <summary>Disables calls to SetForegroundWindow.</summary>
		SFW_LOCK = 1,

		/// <summary>Enables calls to SetForegroundWindow.</summary>
		LSFW_UNLOCK = 2,
	}

	/// <summary>The tiling flags.</summary>
	[PInvokeData("winuser.h")]
	[Flags]
	public enum MdiTileFlags
	{
		/// <summary>Tiles windows horizontally.</summary>
		MDITILE_VERTICAL = 0x0000,

		/// <summary>Tiles windows vertically.</summary>
		MDITILE_HORIZONTAL = 0x0001,

		/// <summary>Prevents disabled MDI child windows from being cascaded.</summary>
		MDITILE_SKIPDISABLED = 0x0002,

		/// <summary>
		/// Arranges the windows in Z order. If this value is not specified, the windows are arranged using the order specified in the
		/// lpKids array.
		/// </summary>
		MDITILE_ZORDER = 0x0004,
	}

	/// <summary>The action to be performed on <see cref="ChangeWindowMessageFilterEx"/>.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "changewindowmessagefilterex")]
	public enum MessageFilterExAction
	{
		/// <summary>
		/// Resets the window message filter for hWnd to the default. Any message allowed globally or process-wide will get through, but
		/// any message not included in those two categories, and which comes from a lower privileged process, will be blocked.
		/// </summary>
		MSGFLT_RESET = 0,

		/// <summary>
		/// Allows the message through the filter. This enables the message to be received by hWnd, regardless of the source of the
		/// message, even it comes from a lower privileged process.
		/// </summary>
		MSGFLT_ALLOW = 1,

		/// <summary>
		/// Blocks the message to be delivered to hWnd if it comes from a lower privileged process, unless the message is allowed
		/// process-wide by using the ChangeWindowMessageFilter function or globally.
		/// </summary>
		MSGFLT_DISALLOW = 2,
	}

	/// <summary>The action to be performed on <see cref="ChangeWindowMessageFilter"/>.</summary>
	public enum MessageFilterFlag
	{
		/// <summary>Adds the message to the filter. This has the effect of allowing the message to be received.</summary>
		MSGFLT_ADD = 1,

		/// <summary>Removes the message from the filter. This has the effect of blocking the message.</summary>
		MSGFLT_REMOVE = 2,
	}

	/// <summary>Return values for <see cref="CHANGEFILTERSTRUCT.ExtStatus"/>.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "changefilterstruct")]
	public enum MessageFilterInformation : uint
	{
		/// <summary>See the Remarks section of <see cref="CHANGEFILTERSTRUCT"/>. Applies to MSGFLT_ALLOW and MSGFLT_DISALLOW.</summary>
		MSGFLTINFO_NONE = 0,

		/// <summary>
		/// The message has already been allowed by this window's message filter, and the function thus succeeded with no change to the
		/// window's message filter. Applies to MSGFLT_ALLOW.
		/// </summary>
		MSGFLTINFO_ALREADYALLOWED_FORWND = 1,

		/// <summary>
		/// The message has already been blocked by this window's message filter, and the function thus succeeded with no change to the
		/// window's message filter. Applies to MSGFLT_DISALLOW.
		/// </summary>
		MSGFLTINFO_ALREADYDISALLOWED_FORWND = 2,

		/// <summary>The message is allowed at a scope higher than the window. Applies to MSGFLT_DISALLOW.</summary>
		MSGFLTINFO_ALLOWED_HIGHER = 3,
	}

	/// <summary>
	/// <para>
	/// This topic describes the constant values used to describe the state of objects in an application UI. The state constants are
	/// defined in oleacc.h.
	/// </para>
	/// <para>
	/// An object is associated with one or more of these state values at any time. The following object state constants are not used:
	/// STATE_SYSTEM_ALERT_HIGH, STATE_SYSTEM_ALERT_MEDIUM, STATE_SYSTEM_ALERT_LOW, and STATE_SYSTEM_FLOATING.
	/// </para>
	/// <para>
	/// Clients retrieve an object's state by calling <c>IAccessible::get_accState</c>, which returns an integer that is a combination of
	/// the following bit flags. Clients call <c>GetStateText</c> with the state value to retrieve a localized string that describes the
	/// object's state.
	/// </para>
	/// <para>
	/// When the state of an object changes, servers should call <c>NotifyWinEvent</c> with the <c>EVENT_OBJECT_STATECHANGE</c> event
	/// constant. However, objects with the STATE_SYSTEM_INVISIBLE, STATE_SYSTEM_FOCUSED, and STATE_SYSTEM_ SELECTED object state
	/// constants have their own event constants. For these objects, do not use <c>EVENT_OBJECT_STATECHANGE</c>. Instead, use the
	/// individual event constant.
	/// </para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/WinAuto/object-state-constants
	[PInvokeData("winuser.h", MSDNShortId = "1253d2d2-d931-4380-9ae8-f4e1fdaee817")]
	[Flags]
	public enum ObjectState : uint
	{
		/// <summary>Indicates that the object does not have another state assigned to it.</summary>
		STATE_SYSTEM_NORMAL = 0,

		/// <summary>
		/// (This object state constant is not supported.) Indicates important information to be immediately conveyed to the user. For
		/// example, when a battery reaches a critically low level, a level indicator generates a high-level alert. As a result, a blind
		/// access tool immediately announces this information to the user, and a screen magnification program scrolls the screen so that
		/// the battery indicator is in view. This state is also appropriate for any prompt or operation that must be completed before
		/// the user can continue.
		/// </summary>
		STATE_SYSTEM_ALERT_HIGH = 0x10000000,

		/// <summary>
		/// (This object state constant is not supported.) Indicates low-priority information that is not important to the user. This
		/// state is used, for example, when Word changes the appearance of the TipWizard button on its toolbar to indicate that it has a
		/// hint for the user.
		/// </summary>
		STATE_SYSTEM_ALERT_LOW = 0x04000000,

		/// <summary>
		/// (This object state constant is not supported.) Indicates important information that is not conveyed immediately to the user.
		/// For example, when a battery is starting to reach a low level, a level indicator generates a medium-level alert. A blind
		/// access tool then generates a sound to let the user know that important information is available, without actually
		/// interrupting the user's work. The user could then query the alert information when convenient.
		/// </summary>
		STATE_SYSTEM_ALERT_MEDIUM = 0x08000000,

		/// <summary>
		/// The object's appearance changes rapidly or constantly. Graphics that are animated occasionally are described as
		/// ROLE_SYSTEM_GRAPHIC with the State property set to STATE_SYSTEM_ANIMATED. This state is used to indicate that the object's
		/// location is changing.
		/// </summary>
		STATE_SYSTEM_ANIMATED = 0x00004000,

		/// <summary>The control cannot accept input at this time.</summary>
		STATE_SYSTEM_BUSY = 0x00000800,

		/// <summary>The object's check box is selected.</summary>
		STATE_SYSTEM_CHECKED = 0x00000010,

		/// <summary>The object's children that have the ROLE_SYSTEM_OUTLINEITEM role are hidden.</summary>
		STATE_SYSTEM_COLLAPSED = 0x00000400,

		/// <summary>This state represents the default button in a window.</summary>
		STATE_SYSTEM_DEFAULT = 0x00000100,

		/// <summary>The object's children that have the ROLE_SYSTEM_OUTLINEITEM role are displayed.</summary>
		STATE_SYSTEM_EXPANDED = 0x00000200,

		/// <summary>
		/// Indicates that an object extends its selection by using SELFLAG_EXTENDSELECTION in the IAccessible::accSelect method.
		/// </summary>
		STATE_SYSTEM_EXTSELECTABLE = 0x02000000,

		/// <summary>
		/// (This object state constant is not supported.) The object is not clipped to the boundary of its parent object, and it does
		/// not move automatically when the parent moves.
		/// </summary>
		STATE_SYSTEM_FLOATING = 0x00001000,

		/// <summary>The object is on the active window and is ready to receive keyboard focus.</summary>
		STATE_SYSTEM_FOCUSABLE = 0x00100000,

		/// <summary>
		/// The object has the keyboard focus. Do not confuse object focus with object selection. For more information, see Selection and
		/// Focus Properties and Methods. For objects with this object state, send the EVENT_OBJECT_SHOW or EVENT_OBJECT_HIDE WinEvents
		/// to notify client applications about state changes. Do not use EVENT_OBJECT_STATECHANGE.
		/// </summary>
		STATE_SYSTEM_FOCUSED = 0x00000004,

		/// <summary>When invoked, the object displays a pop-up menu or a window.</summary>
		STATE_SYSTEM_HASPOPUP = 0x40000000,

		/// <summary>
		/// The object is hot-tracked by the mouse, which means that the object's appearance has changed to indicate that the mouse
		/// pointer is located over it.
		/// </summary>
		STATE_SYSTEM_HOTTRACKED = 0x00000080,

		/// <summary>
		/// Indicates that the state of a three-state check box or toolbar button is not determined. The check box is neither selected
		/// nor cleared and is therefore in the third or mixed state.
		/// </summary>
		STATE_SYSTEM_INDETERMINATE = STATE_SYSTEM_MIXED,

		/// <summary>
		/// The object is programmatically hidden. For example, menu items are programmatically hidden until a user activates the menu.
		/// Because objects with this state are not available to users, client applications must not communicate information about the
		/// object to users. However, if client applications find an object with this state, they should check whether
		/// STATE_SYSTEM_OFFSCREEN is also set. If this second state is defined, clients can communicate the information about the object
		/// to users. For example, a list box can have both STATE_SYSTEM_INVISIBLE and STATE_SYSTEM_OFFSCREEN set. In this case, the
		/// client application can communicate all items in the list to users.
		/// <para>
		/// If a client application is navigating through an IAccessible tree and encounters a parent object that is invisible, Microsoft
		/// Active Accessibility will not expose information about any possible children of the parent as long as the parent is invisible.
		/// </para>
		/// </summary>
		STATE_SYSTEM_INVISIBLE = 0x00008000,

		/// <summary>Indicates that the object is formatted as a hyperlink. The object's role will usually be ROLE_SYSTEM_TEXT.</summary>
		STATE_SYSTEM_LINKED = 0x00400000,

		/// <summary>Indicates scrolling or moving text or graphics.</summary>
		STATE_SYSTEM_MARQUEED = 0x00002000,

		/// <summary>
		/// Indicates that the state of a three-state check box or toolbar button is not determined. The check box is neither selected
		/// nor cleared and is therefore in the third or mixed state.
		/// </summary>
		STATE_SYSTEM_MIXED = 0x00000020,

		/// <summary>
		/// Indicates that the object can be moved. For example, a user can click the object's title bar and drag the object to a new location.
		/// </summary>
		STATE_SYSTEM_MOVEABLE = 0x00040000,

		/// <summary>
		/// Indicates that the object accepts multiple selected items; that is, SELFLAG_ADDSELECTION for the IAccessible::accSelect
		/// method is valid.
		/// </summary>
		STATE_SYSTEM_MULTISELECTABLE = 0x01000000,

		/// <summary>
		/// The object is clipped or has scrolled out of view, but it is not programmatically hidden. If the user makes the viewport
		/// larger, more of the object will be visible on the computer screen.
		/// </summary>
		STATE_SYSTEM_OFFSCREEN = 0x00010000,

		/// <summary>The object is pressed.</summary>
		STATE_SYSTEM_PRESSED = 0x00000008,

		/// <summary>The object is a password-protected edit control.</summary>
		STATE_SYSTEM_PROTECTED = 0x20000000,

		/// <summary>The object is designated read-only.</summary>
		STATE_SYSTEM_READONLY = 0x00000040,

		/// <summary>The object accepts selection.</summary>
		STATE_SYSTEM_SELECTABLE = 0x00200000,

		/// <summary>The object is selected.</summary>
		STATE_SYSTEM_SELECTED = 0x00000002,

		/// <summary>
		/// The object or child uses text-to-speech (TTS) technology for description purposes. When an object with this state has the
		/// focus, a speech-based accessibility aid does not announce information because the object automatically announces it.
		/// </summary>
		STATE_SYSTEM_SELFVOICING = 0x00080000,

		/// <summary>The object can be resized. For example, a user could change the size of a window by dragging it by the border.</summary>
		STATE_SYSTEM_SIZEABLE = 0x00020000,

		/// <summary>The object is a hyperlink that has been visited (previously clicked) by a user.</summary>
		STATE_SYSTEM_TRAVERSED = 0x00800000,

		/// <summary>The object is unavailable.</summary>
		STATE_SYSTEM_UNAVAILABLE = 0x00000001,
	}

	/// <summary>Flags for <see cref="PrintWindow"/>.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "00b38cd8-1cfb-408e-88da-6e61563d9d8e")]
	[Flags]
	public enum PW : uint
	{
		/// <summary>Render the entire window.</summary>
		PW_ENTIREWINDOW = 0,

		/// <summary>Only the client area of the window is copied to hdcBlt. By default, the entire window is copied.</summary>
		PW_CLIENTONLY = 1,

		/// <summary>Undocumented</summary>
		PW_RENDERFULLCONTENT = 0x00000002,
	}

	/// <summary>Window sizing and positioning flags.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "setwindowpos")]
	[Flags]
	public enum SetWindowPosFlags : uint
	{
		/// <summary>
		/// If the calling thread and the thread that owns the window are attached to different input queues, the system posts the
		/// request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads
		/// process the request.
		/// </summary>
		SWP_ASYNCWINDOWPOS = 0x4000,

		/// <summary>Prevents generation of the WM_SYNCPAINT message.</summary>
		SWP_DEFERERASE = 0x2000,

		/// <summary>Draws a frame (defined in the window's class description) around the window.</summary>
		SWP_DRAWFRAME = 0x0020,

		/// <summary>
		/// Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to the window, even if the
		/// window's size is not being changed. If this flag is not specified, WM_NCCALCSIZE is sent only when the window's size is being changed.
		/// </summary>
		SWP_FRAMECHANGED = 0x0020,

		/// <summary>Hides the window.</summary>
		SWP_HIDEWINDOW = 0x0080,

		/// <summary>
		/// Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or
		/// non-topmost group (depending on the setting of the hWndInsertAfter parameter).
		/// </summary>
		SWP_NOACTIVATE = 0x0010,

		/// <summary>
		/// Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client area are
		/// saved and copied back into the client area after the window is sized or repositioned.
		/// </summary>
		SWP_NOCOPYBITS = 0x0100,

		/// <summary>Retains the current position (ignores X and Y parameters).</summary>
		SWP_NOMOVE = 0x0002,

		/// <summary>Does not change the owner window's position in the Z order.</summary>
		SWP_NOOWNERZORDER = 0x0200,

		/// <summary>
		/// Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area, the
		/// nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of the
		/// window being moved. When this flag is set, the application must explicitly invalidate or redraw any parts of the window and
		/// parent window that need redrawing.
		/// </summary>
		SWP_NOREDRAW = 0x0008,

		/// <summary>Same as the SWP_NOOWNERZORDER flag.</summary>
		SWP_NOREPOSITION = 0x0200,

		/// <summary>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</summary>
		SWP_NOSENDCHANGING = 0x0400,

		/// <summary>Retains the current size (ignores the cx and cy parameters).</summary>
		SWP_NOSIZE = 0x0001,

		/// <summary>Retains the current Z order (ignores the hWndInsertAfter parameter).</summary>
		SWP_NOZORDER = 0x0004,

		/// <summary>Displays the window.</summary>
		SWP_SHOWWINDOW = 0x0040,
	}

	/// <summary>Commands for WM_SYSCOMMAND.</summary>
	[PInvokeData("winuser.h")]
	public enum SysCommand : int
	{
		/// <summary/>
		SC_ARRANGE = 0xF110,

		/// <summary>Closes the window.</summary>
		SC_CLOSE = 0xF060,

		/// <summary>
		/// Changes the cursor to a question mark with a pointer. If the user then clicks a control in the dialog box, the control
		/// receives a WM_HELP message.
		/// </summary>
		SC_CONTEXTHELP = 0xF180,

		/// <summary>Selects the default item; the user double-clicked the window menu.</summary>
		SC_DEFAULT = 0xF160,

		/// <summary>
		/// Activates the window associated with the application-specified hot key. The lParam parameter identifies the window to activate.
		/// </summary>
		SC_HOTKEY = 0xF150,

		/// <summary>Scrolls horizontally.</summary>
		SC_HSCROLL = 0xF080,

		/// <summary>Indicates whether the screen saver is secure.</summary>
		SCF_ISSECURE = 0x00000001,

		/// <summary>Retrieves the window menu as a result of a keystroke. For more information, see the Remarks section.</summary>
		SC_KEYMENU = 0xF100,

		/// <summary>Maximizes the window.</summary>
		SC_MAXIMIZE = 0xF030,

		/// <summary>Minimizes the window.</summary>
		SC_MINIMIZE = 0xF020,

		/// <summary>
		/// Sets the state of the display. This command supports devices that have power-saving features, such as a battery-powered
		/// personal computer.
		/// <para>The lParam parameter can have the following values:</para>
		/// <list type="bullet">
		/// <item>-1 (the display is powering on)</item>
		/// <item>1 (the display is going to low power)</item>
		/// <item>2 (the display is being shut off)</item>
		/// </list>
		/// </summary>
		SC_MONITORPOWER = 0xF170,

		/// <summary>Retrieves the window menu as a result of a mouse click.</summary>
		SC_MOUSEMENU = 0xF090,

		/// <summary>Moves the window.</summary>
		SC_MOVE = 0xF010,

		/// <summary>Moves to the next window.</summary>
		SC_NEXTWINDOW = 0xF040,

		/// <summary>Moves to the previous window.</summary>
		SC_PREVWINDOW = 0xF050,

		/// <summary>Restores the window to its normal position and size.</summary>
		SC_RESTORE = 0xF120,

		/// <summary>Executes the screen saver application specified in the [boot] section of the System.ini file.</summary>
		SC_SCREENSAVE = 0xF140,

		/// <summary/>
		SC_SEPARATOR = 0xF00F,

		/// <summary>Sizes the window.</summary>
		SC_SIZE = 0xF000,

		/// <summary>Activates the Start menu.</summary>
		SC_TASKLIST = 0xF130,

		/// <summary>Scrolls vertically.</summary>
		SC_VSCROLL = 0xF070,
	}

	/// <summary>Options for functions related to popup menus and windows.</summary>
	[PInvokeData("winuser.h")]
	[Flags]
	public enum TrackPopupMenuFlags : uint
	{
		/// <summary>The user can select menu items with only the left mouse button.</summary>
		TPM_LEFTBUTTON = 0x0000,

		/// <summary>The user can select menu items with both the left and right mouse buttons.</summary>
		TPM_RIGHTBUTTON = 0x0002,

		/// <summary>
		/// Positions the pop-up window so that its left edge is aligned with the coordinate specified by the anchorPoint-&gt;x parameter.
		/// </summary>
		TPM_LEFTALIGN = 0x0000,

		/// <summary>Centers pop-up window horizontally relative to the coordinate specified by the anchorPoint-&gt;x parameter.</summary>
		TPM_CENTERALIGN = 0x0004,

		/// <summary>
		/// Positions the pop-up window so that its right edge is aligned with the coordinate specified by the anchorPoint-&gt;x parameter.
		/// </summary>
		TPM_RIGHTALIGN = 0x0008,

		/// <summary>Positions the shortcut menu so that its top side is aligned with the coordinate specified by the y parameter.</summary>
		TPM_TOPALIGN = 0x0000,

		/// <summary>Centers the shortcut menu vertically relative to the coordinate specified by the y parameter.</summary>
		TPM_VCENTERALIGN = 0x0010,

		/// <summary>Positions the shortcut menu so that its bottom side is aligned with the coordinate specified by the y parameter.</summary>
		TPM_BOTTOMALIGN = 0x0020,

		/// <summary>
		/// If the menu cannot be shown at the specified location without overlapping the excluded rectangle, the system tries to
		/// accommodate the requested horizontal alignment before the requested vertical alignment.
		/// </summary>
		TPM_HORIZONTAL = 0x0000,

		/// <summary>
		/// If the menu cannot be shown at the specified location without overlapping the excluded rectangle, the system tries to
		/// accommodate the requested vertical alignment before the requested horizontal alignment.
		/// </summary>
		TPM_VERTICAL = 0x0040,

		/// <summary>The function does not send notification messages when the user clicks a menu item.</summary>
		TPM_NONOTIFY = 0x0080,

		/// <summary>The function returns the menu item identifier of the user's selection in the return value.</summary>
		TPM_RETURNCMD = 0x0100,

		/// <summary>Displays a menu when another menu is already displayed. This is intended to support context menus within a menu.</summary>
		TPM_RECURSE = 0x0001,

		/// <summary>Animates the menu from left to right.</summary>
		TPM_HORPOSANIMATION = 0x0400,

		/// <summary>Animates the menu from right to left.</summary>
		TPM_HORNEGANIMATION = 0x0800,

		/// <summary>Animates the menu from top to bottom.</summary>
		TPM_VERPOSANIMATION = 0x1000,

		/// <summary>Animates the menu from bottom to top.</summary>
		TPM_VERNEGANIMATION = 0x2000,

		/// <summary>Displays menu without animation.</summary>
		TPM_NOANIMATION = 0x4000,

		/// <summary>For right-to-left text layout.</summary>
		TPM_LAYOUTRTL = 0x8000,

		/// <summary>
		/// Restricts the pop-up window to within the work area. If this flag is not set, the pop-up window is restricted to the work
		/// area only if the input point is within the work area. For more information, see the rcWork and rcMonitor members of the
		/// MONITORINFO structure.
		/// </summary>
		TPM_WORKAREA = 0x10000,
	}

	/// <summary>Flags for <see cref="UpdateLayeredWindow(HWND, HDC, in POINT, in SIZE, HDC, in POINT, COLORREF, in Gdi32.BLENDFUNCTION, UpdateLayeredWindowFlags)"/></summary>
	[PInvokeData("winuser.h", MSDNShortId = "updatelayeredwindow")]
	[Flags]
	public enum UpdateLayeredWindowFlags
	{
		/// <summary>Use crKey as the transparency color.</summary>
		ULW_COLORKEY = 0x00000001,

		/// <summary>
		/// Use pblend as the blend function. If the display mode is 256 colors or less, the effect of this value is the same as the
		/// effect of ULW_OPAQUE.
		/// </summary>
		ULW_ALPHA = 0x00000002,

		/// <summary>Draw an opaque layered window.</summary>
		ULW_OPAQUE = 0x00000004,

		/// <summary>
		/// Force the UpdateLayeredWindowIndirect function to fail if the current window size does not match the size specified in the psize.
		/// </summary>
		ULW_EX_NORESIZE = 0x00000008,
	}

	/// <summary>Window class styles.</summary>
	[PInvokeData("winuser.h")]
	[Flags]
	public enum WindowClassStyles : uint
	{
		/// <summary>
		/// Aligns the window's client area on a byte boundary (in the x direction). This style affects the width of the window and its
		/// horizontal placement on the display.
		/// </summary>
		CS_BYTEALIGNCLIENT = 0x1000,

		/// <summary>
		/// Aligns the window on a byte boundary (in the x direction). This style affects the width of the window and its horizontal
		/// placement on the display.
		/// </summary>
		CS_BYTEALIGNWINDOW = 0x2000,

		/// <summary>
		/// Allocates one device context to be shared by all windows in the class. Because window classes are process specific, it is
		/// possible for multiple threads of an application to create a window of the same class. It is also possible for the threads to
		/// attempt to use the device context simultaneously. When this happens, the system allows only one thread to successfully finish
		/// its drawing operation.
		/// </summary>
		CS_CLASSDC = 0x0040,

		/// <summary>
		/// Sends a double-click message to the window procedure when the user double-clicks the mouse while the cursor is within a
		/// window belonging to the class.
		/// </summary>
		CS_DBLCLKS = 0x0008,

		/// <summary>
		/// Enables the drop shadow effect on a window. The effect is turned on and off through SPI_SETDROPSHADOW. Typically, this is
		/// enabled for small, short-lived windows such as menus to emphasize their Z-order relationship to other windows. Windows
		/// created from a class with this style must be top-level windows; they may not be child windows.
		/// </summary>
		CS_DROPSHADOW = 0x00020000,

		/// <summary>
		/// Indicates that the window class is an application global class. For more information, see the "Application Global Classes"
		/// section of About Window Classes.
		/// </summary>
		CS_GLOBALCLASS = 0x4000,

		/// <summary>Redraws the entire window if a movement or size adjustment changes the width of the client area.</summary>
		CS_HREDRAW = 0x0002,

		/// <summary>Disables Close on the window menu.</summary>
		CS_NOCLOSE = 0x0200,

		/// <summary>Allocates a unique device context for each window in the class.</summary>
		CS_OWNDC = 0x0020,

		/// <summary>
		/// Sets the clipping rectangle of the child window to that of the parent window so that the child can draw on the parent. A
		/// window with the CS_PARENTDC style bit receives a regular device context from the system's cache of device contexts. It does
		/// not give the child the parent's device context or device context settings. Specifying CS_PARENTDC enhances an application's performance.
		/// </summary>
		CS_PARENTDC = 0x0080,

		/// <summary>
		/// Saves, as a bitmap, the portion of the screen image obscured by a window of this class. When the window is removed, the
		/// system uses the saved bitmap to restore the screen image, including other windows that were obscured. Therefore, the system
		/// does not send WM_PAINT messages to windows that were obscured if the memory used by the bitmap has not been discarded and if
		/// other screen actions have not invalidated the stored image.
		/// <para>
		/// This style is useful for small windows (for example, menus or dialog boxes) that are displayed briefly and then removed
		/// before other screen activity takes place. This style increases the time required to display the window, because the system
		/// must first allocate memory to store the bitmap.
		/// </para>
		/// </summary>
		CS_SAVEBITS = 0x0800,

		/// <summary>Redraws the entire window if a movement or size adjustment changes the height of the client area.</summary>
		CS_VREDRAW = 0x0001,

		/// <summary>Undocumented.</summary>
		CS_IME = 0x00010000,
	}

	/// <summary>The display affinity setting. This setting specifies where the window's contents are can be displayed.</summary>
	[PInvokeData("winuser.h")]
	public enum WindowDisplayAffinity : uint
	{
		/// <summary>The window's contents can be displayed anywhere.</summary>
		WDA_NONE = 0x00000000,

		/// <summary>The window's contents can only be displayed on a monitor.</summary>
		WDA_MONITOR = 0x00000001
	}

	/// <summary>Flags used by <see cref="WINDOWPLACEMENT.flags"/>.</summary>
	[PInvokeData("winuser.h", MSDNShortId = "windowplacement")]
	[Flags]
	public enum WindowPlacementFlags : uint
	{
		/// <summary>
		/// The coordinates of the minimized window may be specified.
		/// <para>This flag must be specified if the coordinates are set in the ptMinPosition member.</para>
		/// </summary>
		WPF_SETMINPOSITION = 0x0001,

		/// <summary>
		/// The restored window will be maximized, regardless of whether it was maximized before it was minimized. This setting is only
		/// valid the next time the window is restored. It does not change the default restoration behavior.
		/// <para>This flag is only valid when the SW_SHOWMINIMIZED value is specified for the showCmd member.</para>
		/// </summary>
		WPF_RESTORETOMAXIMIZED = 0x0002,

		/// <summary>
		/// If the calling thread and the thread that owns the window are attached to different input queues, the system posts the
		/// request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads
		/// process the request.
		/// </summary>
		WPF_ASYNCWINDOWPLACEMENT = 0x0004
	}

	/// <summary>
	/// <para>
	/// Calculates the required size of the window rectangle, based on the desired client-rectangle size. The window rectangle can then
	/// be passed to the CreateWindow function to create a window whose client area is the desired size.
	/// </para>
	/// <para>To specify an extended window style, use the AdjustWindowRectEx function.</para>
	/// </summary>
	/// <param name="lpRect">
	/// <para>Type: <c>LPRECT</c></para>
	/// <para>
	/// A pointer to a RECT structure that contains the coordinates of the top-left and bottom-right corners of the desired client area.
	/// When the function returns, the structure contains the coordinates of the top-left and bottom-right corners of the window to
	/// accommodate the desired client area.
	/// </para>
	/// </param>
	/// <param name="dwStyle">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The window style of the window whose required size is to be calculated. Note that you cannot specify the <c>WS_OVERLAPPED</c> style.
	/// </para>
	/// </param>
	/// <param name="bMenu">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>Indicates whether the window has a menu.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// A client rectangle is the smallest rectangle that completely encloses a client area. A window rectangle is the smallest rectangle
	/// that completely encloses the window, which includes the client area and the nonclient area.
	/// </para>
	/// <para>The <c>AdjustWindowRect</c> function does not add extra space when a menu bar wraps to two or more rows.</para>
	/// <para>
	/// The <c>AdjustWindowRect</c> function does not take the <c>WS_VSCROLL</c> or <c>WS_HSCROLL</c> styles into account. To account for
	/// the scroll bars, call the GetSystemMetrics function with <c>SM_CXVSCROLL</c> or <c>SM_CYHSCROLL</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-adjustwindowrect BOOL AdjustWindowRect( LPRECT lpRect,
	// DWORD dwStyle, BOOL bMenu );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "adjustwindowrect")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool AdjustWindowRect(ref RECT lpRect, WindowStyles dwStyle, [MarshalAs(UnmanagedType.Bool)] bool bMenu);

	/// <summary>
	/// <para>
	/// Calculates the required size of the window rectangle, based on the desired size of the client rectangle. The window rectangle can
	/// then be passed to the CreateWindowEx function to create a window whose client area is the desired size.
	/// </para>
	/// </summary>
	/// <param name="lpRect">
	/// <para>Type: <c>LPRECT</c></para>
	/// <para>
	/// A pointer to a RECT structure that contains the coordinates of the top-left and bottom-right corners of the desired client area.
	/// When the function returns, the structure contains the coordinates of the top-left and bottom-right corners of the window to
	/// accommodate the desired client area.
	/// </para>
	/// </param>
	/// <param name="dwStyle">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The window style of the window whose required size is to be calculated. Note that you cannot specify the <c>WS_OVERLAPPED</c> style.
	/// </para>
	/// </param>
	/// <param name="bMenu">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>Indicates whether the window has a menu.</para>
	/// </param>
	/// <param name="dwExStyle">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The extended window style of the window whose required size is to be calculated.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// A client rectangle is the smallest rectangle that completely encloses a client area. A window rectangle is the smallest rectangle
	/// that completely encloses the window, which includes the client area and the nonclient area.
	/// </para>
	/// <para>The <c>AdjustWindowRectEx</c> function does not add extra space when a menu bar wraps to two or more rows.</para>
	/// <para>
	/// The <c>AdjustWindowRectEx</c> function does not take the <c>WS_VSCROLL</c> or <c>WS_HSCROLL</c> styles into account. To account
	/// for the scroll bars, call the GetSystemMetrics function with <c>SM_CXVSCROLL</c> or <c>SM_CYHSCROLL</c>.
	/// </para>
	/// <para>
	/// This API is not DPI aware, and should not be used if the calling thread is per-monitor DPI aware. For the DPI-aware version of
	/// this API, see AdjustWindowsRectExForDPI. For more information on DPI awareness, see the Windows High DPI documentation.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-adjustwindowrectex BOOL AdjustWindowRectEx( LPRECT lpRect,
	// DWORD dwStyle, BOOL bMenu, DWORD dwExStyle );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "adjustwindowrectex")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool AdjustWindowRectEx(ref RECT lpRect, WindowStyles dwStyle, [MarshalAs(UnmanagedType.Bool)] bool bMenu, WindowStylesEx dwExStyle);

	/// <summary>
	/// <para>
	/// Enables the specified process to set the foreground window using the SetForegroundWindow function. The calling process must
	/// already be able to set the foreground window. For more information, see Remarks later in this topic.
	/// </para>
	/// </summary>
	/// <param name="dwProcessId">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The identifier of the process that will be enabled to set the foreground window. If this parameter is <c>ASFW_ANY</c>, all
	/// processes will be enabled to set the foreground window.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>
	/// If the function fails, the return value is zero. The function will fail if the calling process cannot set the foreground window.
	/// To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the
	/// following conditions is true:
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>The process is the foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The process was started by the foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The process received the last input event.</term>
	/// </item>
	/// <item>
	/// <term>There is no foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The foreground process is being debugged.</term>
	/// </item>
	/// <item>
	/// <term>The foreground is not locked (see LockSetForegroundWindow).</term>
	/// </item>
	/// <item>
	/// <term>The foreground lock time-out has expired (see <c>SPI_GETFOREGROUNDLOCKTIMEOUT</c> in SystemParametersInfo).</term>
	/// </item>
	/// <item>
	/// <term>No menus are active.</term>
	/// </item>
	/// </list>
	/// <para>
	/// A process that can set the foreground window can enable another process to set the foreground window by calling
	/// <c>AllowSetForegroundWindow</c>. The process specified by dwProcessId loses the ability to set the foreground window the next
	/// time the user generates input, unless the input is directed at that process, or the next time a process calls
	/// <c>AllowSetForegroundWindow</c>, unless that process is specified.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-allowsetforegroundwindow BOOL AllowSetForegroundWindow(
	// DWORD dwProcessId );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "allowsetforegroundwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool AllowSetForegroundWindow(uint dwProcessId);

	/// <summary>
	/// <para>
	/// Enables you to produce special effects when showing or hiding windows. There are four types of animation: roll, slide, collapse
	/// or expand, and alpha-blended fade.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to animate. The calling thread must own this window.</para>
	/// </param>
	/// <param name="dwTime">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The time it takes to play the animation, in milliseconds. Typically, an animation takes 200 milliseconds to play.</para>
	/// </param>
	/// <param name="dwFlags">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The type of animation. This parameter can be one or more of the following values. Note that, by default, these flags take effect
	/// when showing a window. To take effect when hiding a window, use <c>AW_HIDE</c> and a logical OR operator with the appropriate flags.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>AW_ACTIVATE 0x00020000</term>
	/// <term>Activates the window. Do not use this value with AW_HIDE.</term>
	/// </item>
	/// <item>
	/// <term>AW_BLEND 0x00080000</term>
	/// <term>Uses a fade effect. This flag can be used only if hwnd is a top-level window.</term>
	/// </item>
	/// <item>
	/// <term>AW_CENTER 0x00000010</term>
	/// <term>
	/// Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used. The various direction
	/// flags have no effect.
	/// </term>
	/// </item>
	/// <item>
	/// <term>AW_HIDE 0x00010000</term>
	/// <term>Hides the window. By default, the window is shown.</term>
	/// </item>
	/// <item>
	/// <term>AW_HOR_POSITIVE 0x00000001</term>
	/// <term>
	/// Animates the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with
	/// AW_CENTER or AW_BLEND.
	/// </term>
	/// </item>
	/// <item>
	/// <term>AW_HOR_NEGATIVE 0x00000002</term>
	/// <term>
	/// Animates the window from right to left. This flag can be used with roll or slide animation. It is ignored when used with
	/// AW_CENTER or AW_BLEND.
	/// </term>
	/// </item>
	/// <item>
	/// <term>AW_SLIDE 0x00040000</term>
	/// <term>Uses slide animation. By default, roll animation is used. This flag is ignored when used with AW_CENTER.</term>
	/// </item>
	/// <item>
	/// <term>AW_VER_POSITIVE 0x00000004</term>
	/// <term>
	/// Animates the window from top to bottom. This flag can be used with roll or slide animation. It is ignored when used with
	/// AW_CENTER or AW_BLEND.
	/// </term>
	/// </item>
	/// <item>
	/// <term>AW_VER_NEGATIVE 0x00000008</term>
	/// <term>
	/// Animates the window from bottom to top. This flag can be used with roll or slide animation. It is ignored when used with
	/// AW_CENTER or AW_BLEND.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. The function will fail in the following situations:</para>
	/// <list type="bullet">
	/// <item>
	/// <term>If the window is already visible and you are trying to show the window.</term>
	/// </item>
	/// <item>
	/// <term>If the window is already hidden and you are trying to hide the window.</term>
	/// </item>
	/// <item>
	/// <term>If there is no direction specified for the slide or roll animation.</term>
	/// </item>
	/// <item>
	/// <term>When trying to animate a child window with <c>AW_BLEND</c>.</term>
	/// </item>
	/// <item>
	/// <term>If the thread does not own the window. Note that, in this case, <c>AnimateWindow</c> fails but GetLastError returns <c>ERROR_SUCCESS</c>.</term>
	/// </item>
	/// </list>
	/// <para>To get extended error information, call the GetLastError function.</para>
	/// </returns>
	/// <remarks>
	/// <para>To show or hide a window without special effects, use ShowWindow.</para>
	/// <para>
	/// When using slide or roll animation, you must specify the direction. It can be either <c>AW_HOR_POSITIVE</c>,
	/// <c>AW_HOR_NEGATIVE</c>, AW_VER_POSITIVE, or AW_VER_NEGATIVE.
	/// </para>
	/// <para>
	/// You can combine <c>AW_HOR_POSITIVE</c> or <c>AW_HOR_NEGATIVE</c> with <c>AW_VER_POSITIVE</c> or <c>AW_VER_NEGATIVE</c> to animate
	/// a window diagonally.
	/// </para>
	/// <para>
	/// The window procedures for the window and its child windows should handle any WM_PRINT or WM_PRINTCLIENT messages. Dialog boxes,
	/// controls, and common controls already handle <c>WM_PRINTCLIENT</c>. The default window procedure already handles <c>WM_PRINT</c>.
	/// </para>
	/// <para>If a child window is displayed partially clipped, when it is animated it will have holes where it is clipped.</para>
	/// <para><c>AnimateWindow</c> supports RTL windows.</para>
	/// <para>Avoid animating a window that has a drop shadow because it produces visually distracting, jerky animations.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-animatewindow BOOL AnimateWindow( HWND hWnd, DWORD dwTime,
	// DWORD dwFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "animatewindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool AnimateWindow(HWND hWnd, uint dwTime, uint dwFlags);

	/// <summary>
	/// <para>
	/// Indicates whether an owned, visible, top-level pop-up, or overlapped window exists on the screen. The function searches the
	/// entire screen, not just the calling application's client area.
	/// </para>
	/// <para>This function is provided only for compatibility with 16-bit versions of Windows. It is generally not useful.</para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If a pop-up window exists, the return value is nonzero, even if the pop-up window is completely covered by other windows.</para>
	/// <para>If a pop-up window does not exist, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>This function does not detect unowned pop-up windows or windows that do not have the <c>WS_VISIBLE</c> style bit set.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-anypopup BOOL AnyPopup( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "anypopup")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool AnyPopup();

	/// <summary>
	/// <para>Arranges all the minimized (iconic) child windows of the specified parent window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>UINT</c></c></para>
	/// <para>If the function succeeds, the return value is the height of one row of icons.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// An application that maintains its own minimized child windows can use the <c>ArrangeIconicWindows</c> function to arrange icons
	/// in a parent window. This function can also arrange icons on the desktop. To retrieve the window handle to the desktop window, use
	/// the GetDesktopWindow function.
	/// </para>
	/// <para>
	/// An application sends the WM_MDIICONARRANGE message to the multiple-document interface (MDI) client window to prompt the client
	/// window to arrange its minimized MDI child windows.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-arrangeiconicwindows UINT ArrangeIconicWindows( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "arrangeiconicwindows")]
	public static extern uint ArrangeIconicWindows(HWND hWnd);

	/// <summary>
	/// <para>Allocates memory for a multiple-window- position structure and returns the handle to the structure.</para>
	/// </summary>
	/// <param name="nNumWindows">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The initial number of windows for which to store position information. The DeferWindowPos function increases the size of the
	/// structure, if necessary.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HDWP</c></c></para>
	/// <para>
	/// If the function succeeds, the return value identifies the multiple-window-position structure. If insufficient system resources
	/// are available to allocate the structure, the return value is <c>NULL</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>The multiple-window-position structure is an internal structure; an application cannot access it directly.</para>
	/// <para>
	/// DeferWindowPos fills the multiple-window-position structure with information about the target position for one or more windows
	/// about to be moved. The EndDeferWindowPos function accepts the handle to this structure and repositions the windows by using the
	/// information stored in the structure.
	/// </para>
	/// <para>
	/// If any of the windows in the multiple-window- position structure have the <c>SWP_HIDEWINDOW</c> or <c>SWP_SHOWWINDOW</c> flag
	/// set, none of the windows are repositioned.
	/// </para>
	/// <para>
	/// If the system must increase the size of the multiple-window- position structure beyond the initial size specified by the
	/// nNumWindows parameter but cannot allocate enough memory to do so, the system fails the entire window positioning sequence (
	/// <c>BeginDeferWindowPos</c>, DeferWindowPos, and EndDeferWindowPos). By specifying the maximum size needed, an application can
	/// detect and process failure early in the process.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-begindeferwindowpos HDWP BeginDeferWindowPos( int
	// nNumWindows );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "begindeferwindowpos")]
	public static extern HDWP BeginDeferWindowPos(int nNumWindows);

	/// <summary>
	/// <para>
	/// Brings the specified window to the top of the Z order. If the window is a top-level window, it is activated. If the window is a
	/// child window, the top-level parent window associated with the child window is activated.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to bring to the top of the Z order.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>Use the <c>BringWindowToTop</c> function to uncover any window that is partially or completely obscured by other windows.</para>
	/// <para>
	/// Calling this function is similar to calling the SetWindowPos function to change a window's position in the Z order.
	/// <c>BringWindowToTop</c> does not make a window a top-level window.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-bringwindowtotop BOOL BringWindowToTop( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "bringwindowtotop")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool BringWindowToTop(HWND hWnd);

	/// <summary>
	/// <para>
	/// Calculates an appropriate pop-up window position using the specified anchor point, pop-up window size, flags, and the optional
	/// exclude rectangle. When the specified pop-up window size is smaller than the desktop window size, use the
	/// <c>CalculatePopupWindowPosition</c> function to ensure that the pop-up window is fully visible on the desktop window, regardless
	/// of the specified anchor point.
	/// </para>
	/// </summary>
	/// <param name="anchorPoint">
	/// <para>Type: <c>const POINT*</c></para>
	/// <para>The specified anchor point.</para>
	/// </param>
	/// <param name="windowSize">
	/// <para>Type: <c>const SIZE*</c></para>
	/// <para>The specified window size.</para>
	/// </param>
	/// <param name="flags">
	/// <para>Type: <c>UINT</c></para>
	/// <para>
	/// Use one of the following flags to specify how the function positions the pop-up window horizontally and vertically. The flags are
	/// the same as the vertical and horizontal positioning flags of the TrackPopupMenuEx function.
	/// </para>
	/// <para>Use one of the following flags to specify how the function positions the pop-up window horizontally.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>TPM_CENTERALIGN 0x0004L</term>
	/// <term>Centers pop-up window horizontally relative to the coordinate specified by the anchorPoint-&gt;x parameter.</term>
	/// </item>
	/// <item>
	/// <term>TPM_LEFTALIGN 0x0000L</term>
	/// <term>Positions the pop-up window so that its left edge is aligned with the coordinate specified by the anchorPoint-&gt;x parameter.</term>
	/// </item>
	/// <item>
	/// <term>TPM_RIGHTALIGN 0x0008L</term>
	/// <term>Positions the pop-up window so that its right edge is aligned with the coordinate specified by the anchorPoint-&gt;x parameter.</term>
	/// </item>
	/// </list>
	/// <para>Uses one of the following flags to specify how the function positions the pop-up window vertically.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>TPM_BOTTOMALIGN 0x0020L</term>
	/// <term>
	/// Positions the pop-up window so that its bottom edge is aligned with the coordinate specified by the anchorPoint-&gt;y parameter.
	/// </term>
	/// </item>
	/// <item>
	/// <term>TPM_TOPALIGN 0x0000L</term>
	/// <term>Positions the pop-up window so that its top edge is aligned with the coordinate specified by the anchorPoint-&gt;y parameter.</term>
	/// </item>
	/// <item>
	/// <term>TPM_VCENTERALIGN 0x0010L</term>
	/// <term>Centers the pop-up window vertically relative to the coordinate specified by the anchorPoint-&gt;y parameter.</term>
	/// </item>
	/// </list>
	/// <para>Use one of the following flags to specify whether to accommodate horizontal or vertical alignment.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>TPM_HORIZONTAL 0x0000L</term>
	/// <term>
	/// If the pop-up window cannot be shown at the specified location without overlapping the excluded rectangle, the system tries to
	/// accommodate the requested horizontal alignment before the requested vertical alignment.
	/// </term>
	/// </item>
	/// <item>
	/// <term>TPM_VERTICAL 0x0040L</term>
	/// <term>
	/// If the pop-up window cannot be shown at the specified location without overlapping the excluded rectangle, the system tries to
	/// accommodate the requested vertical alignment before the requested horizontal alignment.
	/// </term>
	/// </item>
	/// </list>
	/// <para>The following flag is available starting with Windows 7.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>TPM_WORKAREA 0x10000L</term>
	/// <term>
	/// Restricts the pop-up window to within the work area. If this flag is not set, the pop-up window is restricted to the work area
	/// only if the input point is within the work area. For more information, see the rcWork and rcMonitor members of the MONITORINFO structure.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="excludeRect">
	/// <para>Type: <c>RECT*</c></para>
	/// <para>A pointer to a structure that specifies the exclude rectangle. It can be <c>NULL</c>.</para>
	/// </param>
	/// <param name="popupWindowPosition">
	/// <para>Type: <c>RECT*</c></para>
	/// <para>A pointer to a structure that specifies the pop-up window position.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// If the function succeeds, it returns <c>TRUE</c>; otherwise, it returns <c>FALSE</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para><c>TPM_WORKAREA</c> is supported for the TrackPopupMenu and TrackPopupMenuEx functions.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-calculatepopupwindowposition BOOL
	// CalculatePopupWindowPosition( const POINT *anchorPoint, const SIZE *windowSize, UINT flags, RECT *excludeRect, RECT
	// *popupWindowPosition );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "calculatepopupwindowposition")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool CalculatePopupWindowPosition(in POINT anchorPoint, in SIZE windowSize, TrackPopupMenuFlags flags, [Optional] PRECT? excludeRect, out RECT popupWindowPosition);

	/// <summary>Passes message information to the specified window procedure.</summary>
	/// <param name="lpPrevWndFunc">
	/// <para>Type: <c>WNDPROC</c></para>
	/// <para>
	/// The previous window procedure. If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to
	/// <c>GWL_WNDPROC</c> or <c>DWL_DLGPROC</c>, it is actually either the address of a window or dialog box procedure, or a special
	/// internal value meaningful only to <c>CallWindowProc</c>.
	/// </para>
	/// </param>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window procedure to receive the message.</para>
	/// </param>
	/// <param name="Msg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message-specific information. The contents of this parameter depend on the value of the Msg parameter.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message-specific information. The contents of this parameter depend on the value of the Msg parameter.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>LRESULT</c></c></para>
	/// <para>The return value specifies the result of the message processing and depends on the message sent.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Use the <c>CallWindowProc</c> function for window subclassing. Usually, all windows with the same class share one window
	/// procedure. A subclass is a window or set of windows with the same class whose messages are intercepted and processed by another
	/// window procedure (or procedures) before being passed to the window procedure of the class.
	/// </para>
	/// <para>
	/// The SetWindowLong function creates the subclass by changing the window procedure associated with a particular window, causing the
	/// system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the
	/// new window procedure to the previous window procedure by calling <c>CallWindowProc</c>. This allows the application to create a
	/// chain of window procedures.
	/// </para>
	/// <para>
	/// If <c>STRICT</c> is defined, the lpPrevWndFunc parameter has the data type <c>WNDPROC</c>. The <c>WNDPROC</c> type is declared as follows:
	/// </para>
	/// <para>
	/// If <c>STRICT</c> is not defined, the lpPrevWndFunc parameter has the data type <c>FARPROC</c>. The <c>FARPROC</c> type is
	/// declared as follows:
	/// </para>
	/// <para>
	/// In C, the <c>FARPROC</c> declaration indicates a callback function that has an unspecified parameter list. In C++, however, the
	/// empty parameter list in the declaration indicates that a function has no parameters. This subtle distinction can break careless
	/// code. Following is one way to handle this situation:
	/// </para>
	/// <para>
	/// For further information about functions declared with empty argument lists, refer to The C++ Programming Language, Second
	/// Edition, by Bjarne Stroustrup.
	/// </para>
	/// <para>
	/// The <c>CallWindowProc</c> function handles Unicode-to-ANSI conversion. You cannot take advantage of this conversion if you call
	/// the window procedure directly.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Subclassing a Window</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-callwindowproca LRESULT CallWindowProcA( WNDPROC
	// lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern IntPtr CallWindowProc([In, MarshalAs(UnmanagedType.FunctionPtr)] WindowProc lpPrevWndFunc, HWND hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

	/// <summary>Passes message information to the specified window procedure.</summary>
	/// <param name="lpPrevWndFunc">
	/// <para>Type: <c>WNDPROC</c></para>
	/// <para>
	/// The previous window procedure. If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to
	/// <c>GWL_WNDPROC</c> or <c>DWL_DLGPROC</c>, it is actually either the address of a window or dialog box procedure, or a special
	/// internal value meaningful only to <c>CallWindowProc</c>.
	/// </para>
	/// </param>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window procedure to receive the message.</para>
	/// </param>
	/// <param name="Msg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message-specific information. The contents of this parameter depend on the value of the Msg parameter.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message-specific information. The contents of this parameter depend on the value of the Msg parameter.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>LRESULT</c></c></para>
	/// <para>The return value specifies the result of the message processing and depends on the message sent.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Use the <c>CallWindowProc</c> function for window subclassing. Usually, all windows with the same class share one window
	/// procedure. A subclass is a window or set of windows with the same class whose messages are intercepted and processed by another
	/// window procedure (or procedures) before being passed to the window procedure of the class.
	/// </para>
	/// <para>
	/// The SetWindowLong function creates the subclass by changing the window procedure associated with a particular window, causing the
	/// system to call the new window procedure instead of the previous one. An application must pass any messages not processed by the
	/// new window procedure to the previous window procedure by calling <c>CallWindowProc</c>. This allows the application to create a
	/// chain of window procedures.
	/// </para>
	/// <para>
	/// If <c>STRICT</c> is defined, the lpPrevWndFunc parameter has the data type <c>WNDPROC</c>. The <c>WNDPROC</c> type is declared as follows:
	/// </para>
	/// <para>
	/// If <c>STRICT</c> is not defined, the lpPrevWndFunc parameter has the data type <c>FARPROC</c>. The <c>FARPROC</c> type is
	/// declared as follows:
	/// </para>
	/// <para>
	/// In C, the <c>FARPROC</c> declaration indicates a callback function that has an unspecified parameter list. In C++, however, the
	/// empty parameter list in the declaration indicates that a function has no parameters. This subtle distinction can break careless
	/// code. Following is one way to handle this situation:
	/// </para>
	/// <para>
	/// For further information about functions declared with empty argument lists, refer to The C++ Programming Language, Second
	/// Edition, by Bjarne Stroustrup.
	/// </para>
	/// <para>
	/// The <c>CallWindowProc</c> function handles Unicode-to-ANSI conversion. You cannot take advantage of this conversion if you call
	/// the window procedure directly.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Subclassing a Window</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-callwindowproca LRESULT CallWindowProcA( WNDPROC
	// lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern IntPtr CallWindowProc([In] IntPtr lpPrevWndFunc, HWND hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

	/// <summary>
	/// <para>Cascades the specified child windows of the specified parent window.</para>
	/// </summary>
	/// <param name="hwndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window. If this parameter is <c>NULL</c>, the desktop window is assumed.</para>
	/// </param>
	/// <param name="wHow">
	/// <para>Type: <c>UINT</c></para>
	/// <para>A cascade flag. This parameter can be one or more of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>MDITILE_SKIPDISABLED 0x0002</term>
	/// <term>Prevents disabled MDI child windows from being cascaded.</term>
	/// </item>
	/// <item>
	/// <term>MDITILE_ZORDER 0x0004</term>
	/// <term>
	/// Arranges the windows in Z order. If this value is not specified, the windows are arranged using the order specified in the lpKids array.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="lpRect">
	/// <para>Type: <c>const RECT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the rectangular area, in client coordinates, within which the windows are arranged. This
	/// parameter can be <c>NULL</c>, in which case the client area of the parent window is used.
	/// </para>
	/// </param>
	/// <param name="cKids">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The number of elements in the array specified by the lpKids parameter. This parameter is ignored if lpKids is <c>NULL</c>.</para>
	/// </param>
	/// <param name="lpKids">
	/// <para>Type: <c>const HWND*</c></para>
	/// <para>
	/// An array of handles to the child windows to arrange. If a specified child window is a top-level window with the style
	/// <c>WS_EX_TOPMOST</c> or <c>WS_EX_TOOLWINDOW</c>, the child window is not arranged. If this parameter is <c>NULL</c>, all child
	/// windows of the specified parent window (or of the desktop window) are arranged.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>WORD</c></c></para>
	/// <para>If the function succeeds, the return value is the number of windows arranged.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// By default, <c>CascadeWindows</c> arranges the windows in the order provided by the lpKids array, but preserves the Z-Order. If
	/// you specify the <c>MDITILE_ZORDER</c> flag, <c>CascadeWindows</c> arranges the windows in Z order.
	/// </para>
	/// <para>Calling <c>CascadeWindows</c> causes all maximized windows to be restored to their previous size.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-cascadewindows WORD CascadeWindows( HWND hwndParent, UINT
	// wHow, CONST RECT *lpRect, UINT cKids, const HWND *lpKids );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "cascadewindows")]
	public static extern ushort CascadeWindows([Optional] HWND hwndParent, uint wHow, [In, Optional] PRECT? lpRect, uint cKids, [In, Optional, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] HWND[]? lpKids);

	/// <summary>
	/// <para>
	/// [Using the <c>ChangeWindowMessageFilter</c> function is not recommended, as it has process-wide scope. Instead, use the
	/// ChangeWindowMessageFilterEx function to control access to specific windows as needed. <c>ChangeWindowMessageFilter</c> may not be
	/// supported in future versions of Windows.]
	/// </para>
	/// <para>Adds or removes a message from the User Interface Privilege Isolation (UIPI) message filter.</para>
	/// </summary>
	/// <param name="message">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message to add to or remove from the filter.</para>
	/// </param>
	/// <param name="dwFlag">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The action to be performed. One of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>MSGFLT_ADD 1</term>
	/// <term>Adds the message to the filter. This has the effect of allowing the message to be received.</term>
	/// </item>
	/// <item>
	/// <term>MSGFLT_REMOVE 2</term>
	/// <term>Removes the message from the filter. This has the effect of blocking the message.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para><c>TRUE</c> if successful; otherwise, <c>FALSE</c>. To get extended error information, call GetLastError.</para>
	/// <para>
	/// <c>Note</c> A message can be successfully removed from the filter, but that is not a guarantee that the message will be blocked.
	/// See the Remarks section for more details.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// UIPI is a security feature that prevents messages from being received from a lower integrity level sender. All such messages with
	/// a value above <c>WM_USER</c> are blocked by default. The filter, somewhat contrary to intuition, is a list of messages that are
	/// allowed through. Therefore, adding a message to the filter allows that message to be received from a lower integrity sender,
	/// while removing a message blocks that message from being received.
	/// </para>
	/// <para>
	/// Certain messages with a value less than <c>WM_USER</c> are required to pass through the filter regardless of the filter setting.
	/// You can call this function to remove one of those messages from the filter and it will return <c>TRUE</c>. However, the message
	/// will still be received by the calling process.
	/// </para>
	/// <para>
	/// Processes at or below <c>SECURITY_MANDATORY_LOW_RID</c> are not allowed to change the filter. If those processes call this
	/// function, it will fail.
	/// </para>
	/// <para>For more information on integrity levels, see Understanding and Working in Protected Mode Internet Explorer.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-changewindowmessagefilter BOOL ChangeWindowMessageFilter(
	// UINT message, DWORD dwFlag );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "changewindowmessagefilter")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ChangeWindowMessageFilter(uint message, MessageFilterFlag dwFlag);

	/// <summary>
	/// <para>Modifies the User Interface Privilege Isolation (UIPI) message filter for a specified window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose UIPI message filter is to be modified.</para>
	/// </param>
	/// <param name="message">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message that the message filter allows through or blocks.</para>
	/// </param>
	/// <param name="action">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The action to be performed, and can take one of the following values:</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>MSGFLT_ALLOW 1</term>
	/// <term>
	/// Allows the message through the filter. This enables the message to be received by hWnd, regardless of the source of the message,
	/// even it comes from a lower privileged process.
	/// </term>
	/// </item>
	/// <item>
	/// <term>MSGFLT_DISALLOW 2</term>
	/// <term>
	/// Blocks the message to be delivered to hWnd if it comes from a lower privileged process, unless the message is allowed
	/// process-wide by using the ChangeWindowMessageFilter function or globally.
	/// </term>
	/// </item>
	/// <item>
	/// <term>MSGFLT_RESET 0</term>
	/// <term>
	/// Resets the window message filter for hWnd to the default. Any message allowed globally or process-wide will get through, but any
	/// message not included in those two categories, and which comes from a lower privileged process, will be blocked.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="pChangeFilterStruct">
	/// <para>Type: <c>PCHANGEFILTERSTRUCT</c></para>
	/// <para>Optional pointer to a CHANGEFILTERSTRUCT structure.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// If the function succeeds, it returns <c>TRUE</c>; otherwise, it returns <c>FALSE</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// UIPI is a security feature that prevents messages from being received from a lower-integrity-level sender. You can use this
	/// function to allow specific messages to be delivered to a window even if the message originates from a process at a lower
	/// integrity level. Unlike the ChangeWindowMessageFilter function, which controls the process message filter, the
	/// <c>ChangeWindowMessageFilterEx</c> function controls the window message filter.
	/// </para>
	/// <para>
	/// An application may use the ChangeWindowMessageFilter function to allow or block a message in a process-wide manner. If the
	/// message is allowed by either the process message filter or the window message filter, it will be delivered to the window.
	/// </para>
	/// <para>
	/// Note that processes at or below <c>SECURITY_MANDATORY_LOW_RID</c> are not allowed to change the message filter. If those
	/// processes call this function, it will fail and generate the extended error code, <c>ERROR_ACCESS_DENIED</c>.
	/// </para>
	/// <para>
	/// Certain messages whose value is smaller than <c>WM_USER</c> are required to be passed through the filter, regardless of the
	/// filter setting. There will be no effect when you attempt to use this function to allow or block such messages.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-changewindowmessagefilterex BOOL
	// ChangeWindowMessageFilterEx( HWND hwnd, UINT message, DWORD action, PCHANGEFILTERSTRUCT pChangeFilterStruct );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "changewindowmessagefilterex")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ChangeWindowMessageFilterEx(HWND hwnd, uint message, MessageFilterExAction action, ref CHANGEFILTERSTRUCT pChangeFilterStruct);

	/// <summary>
	/// <para>
	/// Determines which, if any, of the child windows belonging to a parent window contains the specified point. The search is
	/// restricted to immediate child windows. Grandchildren, and deeper descendant windows are not searched.
	/// </para>
	/// <para>To skip certain child windows, use the ChildWindowFromPointEx function.</para>
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window.</para>
	/// </param>
	/// <param name="Point">
	/// <para>Type: <c>POINT</c></para>
	/// <para>A structure that defines the client coordinates, relative to hWndParent, of the point to be checked.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// The return value is a handle to the child window that contains the point, even if the child window is hidden or disabled. If the
	/// point lies outside the parent window, the return value is <c>NULL</c>. If the point is within the parent window but not within
	/// any child window, the return value is a handle to the parent window.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The system maintains an internal list, containing the handles of the child windows associated with a parent window. The order of
	/// the handles in the list depends on the Z order of the child windows. If more than one child window contains the specified point,
	/// the system returns a handle to the first window in the list that contains the point.
	/// </para>
	/// <para>
	/// <c>ChildWindowFromPoint</c> treats an <c>HTTRANSPARENT</c> area of a standard control the same as other parts of the control. In
	/// contrast, RealChildWindowFromPoint treats an <c>HTTRANSPARENT</c> area differently; it returns the child window behind a
	/// transparent area of a control. For example, if the point is in a transparent area of a groupbox, <c>ChildWindowFromPoint</c>
	/// returns the groupbox while <c>RealChildWindowFromPoint</c> returns the child window behind the groupbox. However, both APIs
	/// return a static field, even though it, too, returns <c>HTTRANSPARENT</c>.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see "Creating a Combo Box Toolbar" in Using Combo Boxes.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-childwindowfrompoint HWND ChildWindowFromPoint( HWND
	// hWndParent, POINT Point );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "childwindowfrompoint")]
	public static extern HWND ChildWindowFromPoint(HWND hWndParent, POINT Point);

	/// <summary>
	/// <para>
	/// Determines which, if any, of the child windows belonging to the specified parent window contains the specified point. The
	/// function can ignore invisible, disabled, and transparent child windows. The search is restricted to immediate child windows.
	/// Grandchildren and deeper descendants are not searched.
	/// </para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window.</para>
	/// </param>
	/// <param name="pt">
	/// <para>Type: <c>POINT</c></para>
	/// <para>A structure that defines the client coordinates (relative to hwndParent) of the point to be checked.</para>
	/// </param>
	/// <param name="flags">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The child windows to be skipped. This parameter can be one or more of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>CWP_ALL 0x0000</term>
	/// <term>Does not skip any child windows</term>
	/// </item>
	/// <item>
	/// <term>CWP_SKIPDISABLED 0x0002</term>
	/// <term>Skips disabled child windows</term>
	/// </item>
	/// <item>
	/// <term>CWP_SKIPINVISIBLE 0x0001</term>
	/// <term>Skips invisible child windows</term>
	/// </item>
	/// <item>
	/// <term>CWP_SKIPTRANSPARENT 0x0004</term>
	/// <term>Skips transparent child windows</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// The return value is a handle to the first child window that contains the point and meets the criteria specified by uFlags. If the
	/// point is within the parent window but not within any child window that meets the criteria, the return value is a handle to the
	/// parent window. If the point lies outside the parent window or if the function fails, the return value is <c>NULL</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The system maintains an internal list that contains the handles of the child windows associated with a parent window. The order
	/// of the handles in the list depends on the Z order of the child windows. If more than one child window contains the specified
	/// point, the system returns a handle to the first window in the list that contains the point and meets the criteria specified by uFlags.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-childwindowfrompointex HWND ChildWindowFromPointEx( HWND
	// hwnd, POINT pt, UINT flags );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "childwindowfrompointex")]
	public static extern HWND ChildWindowFromPointEx(HWND hwnd, POINT pt, ChildWindowSkipOptions flags);

	/// <summary>
	/// <para>Minimizes (but does not destroy) the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be minimized.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>To destroy a window, an application must use the DestroyWindow function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-closewindow BOOL CloseWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "closewindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool CloseWindow(HWND hWnd);

	/// <summary>
	/// <para>
	/// Creates an overlapped, pop-up, or child window. It specifies the window class, window title, window style, and (optionally) the
	/// initial position and size of the window. The function also specifies the window's parent or owner, if any, and the window's menu.
	/// </para>
	/// <para>To use extended window styles in addition to the styles supported by <c>CreateWindow</c>, use the CreateWindowEx function.</para>
	/// </summary>
	/// <param name="lpClassName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// A <c>null</c>-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom
	/// must be in the low-order word of lpClassName; the high-order word must be zero. If lpClassName is a string, it specifies the window
	/// class name. The class name can be any name registered with <c>RegisterClass</c> or <c>RegisterClassEx</c>, provided that the module
	/// that registers the class is also the module that creates the window. The class name can also be any of the predefined system class
	/// names. For a list of system class names, see the Remarks section.
	/// </para>
	/// </param>
	/// <param name="lpWindowName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The window name. If the window style specifies a title bar, the window title pointed to by lpWindowName is displayed in the title
	/// bar. When using <c>CreateWindow</c> to create controls, such as buttons, check boxes, and static controls, use lpWindowName to
	/// specify the text of the control. When creating a static control with the <c>SS_ICON</c> style, use lpWindowName to specify the icon
	/// name or identifier. To specify an identifier, use the syntax "#num".
	/// </para>
	/// </param>
	/// <param name="dwStyle">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The style of the window being created. This parameter can be a combination of the window style values, plus the control styles
	/// indicated in the Remarks section.
	/// </para>
	/// </param>
	/// <param name="x">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the
	/// window's upper-left corner, in screen coordinates. For a child window, x is the x-coordinate of the upper-left corner of the window
	/// relative to the upper-left corner of the parent window's client area. If this parameter is set to <c>CW_USEDEFAULT</c>, the system
	/// selects the default position for the window's upper-left corner and ignores the y parameter. <c>CW_USEDEFAULT</c> is valid only for
	/// overlapped windows; if it is specified for a pop-up or child window, the x and y parameters are set to zero.
	/// </para>
	/// </param>
	/// <param name="y">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of the
	/// window's upper-left corner, in screen coordinates. For a child window, y is the initial y-coordinate of the upper-left corner of the
	/// child window relative to the upper-left corner of the parent window's client area. For a list box, y is the initial y-coordinate of
	/// the upper-left corner of the list box's client area relative to the upper-left corner of the parent window's client area.
	/// </para>
	/// <para>
	/// If an overlapped window is created with the <c>WS_VISIBLE</c> style bit set and the x parameter is set to <c>CW_USEDEFAULT</c>, then
	/// the y parameter determines how the window is shown. If the y parameter is <c>CW_USEDEFAULT</c>, then the window manager calls
	/// ShowWindow with the <c>SW_SHOW</c> flag after the window has been created. If the y parameter is some other value, then the window
	/// manager calls <c>ShowWindow</c> with that value as the nCmdShow parameter.
	/// </para>
	/// </param>
	/// <param name="nWidth">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The width, in device units, of the window. For overlapped windows, nWidth is either the window's width, in screen coordinates, or
	/// <c>CW_USEDEFAULT</c>. If nWidth is <c>CW_USEDEFAULT</c>, the system selects a default width and height for the window; the default
	/// width extends from the initial x-coordinate to the right edge of the screen, and the default height extends from the initial
	/// y-coordinate to the top of the icon area. <c>CW_USEDEFAULT</c> is valid only for overlapped windows; if <c>CW_USEDEFAULT</c> is
	/// specified for a pop-up or child window, nWidth and nHeight are set to zero.
	/// </para>
	/// </param>
	/// <param name="nHeight">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If nWidth
	/// is set to <c>CW_USEDEFAULT</c>, the system ignores nHeight.
	/// </para>
	/// </param>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid
	/// window handle. This parameter is optional for pop-up windows.
	/// </para>
	/// <para>To create a message-only window, supply <c>HWND_MESSAGE</c> or a handle to an existing message-only window.</para>
	/// </param>
	/// <param name="hMenu">
	/// <para>Type: <c>HMENU</c></para>
	/// <para>
	/// A handle to a menu, or specifies a child-window identifier depending on the window style. For an overlapped or pop-up window, hMenu
	/// identifies the menu to be used with the window; it can be <c>NULL</c> if the class menu is to be used. For a child window, hMenu
	/// specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The
	/// application determines the child-window identifier; it must be unique for all child windows with the same parent window.
	/// </para>
	/// </param>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>A handle to the instance of the module to be associated with the window.</para>
	/// </param>
	/// <param name="lpParam">
	/// <para>Type: <c>LPVOID</c></para>
	/// <para>
	/// A pointer to a value to be passed to the window through the CREATESTRUCT structure ( <c>lpCreateParams</c> member) pointed to by the
	/// lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.
	/// </para>
	/// <para>
	/// If an application calls <c>CreateWindow</c> to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If
	/// an MDI client window calls <c>CreateWindow</c> to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure.
	/// lpParam may be <c>NULL</c> if no additional data is needed.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>If the function succeeds, the return value is a handle to the new window.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// <para>This function typically fails for one of the following reasons:</para>
	/// <list type="bullet">
	/// <item>
	/// <term>an invalid parameter value</term>
	/// </item>
	/// <item>
	/// <term>the system class was registered by a different module</term>
	/// </item>
	/// <item>
	/// <term>The <c>WH_CBT</c> hook is installed and returns a failure code</term>
	/// </item>
	/// <item>
	/// <term>if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE</term>
	/// </item>
	/// </list>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Before returning, <c>CreateWindow</c> sends a WM_CREATE message to the window procedure. For overlapped, pop-up, and child windows,
	/// <c>CreateWindow</c> sends <c>WM_CREATE</c>, WM_GETMINMAXINFO, and WM_NCCREATE messages to the window. The lParam parameter of the
	/// <c>WM_CREATE</c> message contains a pointer to a CREATESTRUCT structure. If the <c>WS_VISIBLE</c> style is specified,
	/// <c>CreateWindow</c> sends the window all the messages required to activate and show the window.
	/// </para>
	/// <para>
	/// If the created window is a child window, its default position is at the bottom of the Z-order. If the created window is a top-level
	/// window, its default position is at the top of the Z-order (but beneath all topmost windows unless the created window is itself topmost).
	/// </para>
	/// <para>For information on controlling whether the Taskbar displays a button for the created window, see Managing Taskbar Buttons.</para>
	/// <para>For information on removing a window, see the DestroyWindow function.</para>
	/// <para>
	/// The following predefined system classes can be specified in the lpClassName parameter. Note the corresponding control styles you can
	/// use in the dwStyle parameter.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>System class</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>BUTTON</term>
	/// <term>
	/// Designates a small rectangular child window that represents a button the user can click to turn it on or off. Button controls can be
	/// used alone or in groups, and they can either be labeled or appear without text. Button controls typically change appearance when the
	/// user clicks them. For more information, see Buttons For a table of the button styles you can specify in the dwStyle parameter, see
	/// Button Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>COMBOBOX</term>
	/// <term>
	/// Designates a control consisting of a list box and a selection field similar to an edit control. When using this style, an application
	/// should either display the list box at all times or enable a drop-down list box. If the list box is visible, typing characters into
	/// the selection field highlights the first list box entry that matches the characters typed. Conversely, selecting an item in the list
	/// box displays the selected text in the selection field. For more information, see Combo Boxes. For a table of the combo box styles you
	/// can specify in the dwStyle parameter, see Combo Box Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>EDIT</term>
	/// <term>
	/// Designates a rectangular child window into which the user can type text from the keyboard. The user selects the control and gives it
	/// the keyboard focus by clicking it or moving to it by pressing the TAB key. The user can type text when the edit control displays a
	/// flashing caret; use the mouse to move the cursor, select characters to be replaced, or position the cursor for inserting characters;
	/// or use the BACKSPACE key to delete characters. For more information, see Edit Controls. For a table of the edit control styles you
	/// can specify in the dwStyle parameter, see Edit Control Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>LISTBOX</term>
	/// <term>
	/// Designates a list of character strings. Specify this control whenever an application must present a list of names, such as file
	/// names, from which the user can choose. The user can select a string by clicking it. A selected string is highlighted, and a
	/// notification message is passed to the parent window. For more information, see List Boxes. For a table of the list box styles you can
	/// specify in the dwStyle parameter, see List Box Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>MDICLIENT</term>
	/// <term>
	/// Designates an MDI client window. This window receives messages that control the MDI application's child windows. The recommended
	/// style bits are WS_CLIPCHILDREN and WS_CHILD. Specify the WS_HSCROLL and WS_VSCROLL styles to create an MDI client window that allows
	/// the user to scroll MDI child windows into view. For more information, see Multiple Document Interface.
	/// </term>
	/// </item>
	/// <item>
	/// <term>RichEdit</term>
	/// <term>
	/// Designates a Microsoft Rich Edit 1.0 control. This window lets the user view and edit text with character and paragraph formatting,
	/// and can include embedded Component Object Model (COM) objects. For more information, see Rich Edit Controls. For a table of the rich
	/// edit control styles you can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>RICHEDIT_CLASS</term>
	/// <term>
	/// Designates a Microsoft Rich Edit 2.0 control. This controls let the user view and edit text with character and paragraph formatting,
	/// and can include embedded COM objects. For more information, see Rich Edit Controls. For a table of the rich edit control styles you
	/// can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SCROLLBAR</term>
	/// <term>
	/// Designates a rectangle that contains a scroll box and has direction arrows at both ends. The scroll bar sends a notification message
	/// to its parent window whenever the user clicks the control. The parent window is responsible for updating the position of the scroll
	/// box, if necessary. For more information, see Scroll Bars. For a table of the scroll bar control styles you can specify in the dwStyle
	/// parameter, see Scroll Bar Control Styles.
	/// </term>
	/// </item>
	/// <item>
	/// <term>STATIC</term>
	/// <term>
	/// Designates a simple text field, box, or rectangle used to label, box, or separate other controls. Static controls take no input and
	/// provide no output. For more information, see Static Controls. For a table of the static control styles you can specify in the dwStyle
	/// parameter, see Static Control Styles.
	/// </term>
	/// </item>
	/// </list>
	/// <para><c>CreateWindow</c> is implemented as a call to the CreateWindowEx function, as shown below.</para>
	/// <para>
	/// <code>#define CreateWindowA(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ CreateWindowExA(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) #define CreateWindowW(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)\ CreateWindowExW(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) #ifdef UNICODE #define CreateWindow CreateWindowW #else #define CreateWindow CreateWindowA #endif</code>
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Using Window Classes.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowa
	// void CreateWindowA( lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam );
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.CreateWindowA")]
	public static SafeHWND CreateWindow(string lpClassName, [Optional] string? lpWindowName, [Optional] WindowStyles dwStyle,
		[Optional] int x, [Optional] int y, [Optional] int nWidth, [Optional] int nHeight, [Optional] HWND hWndParent, [Optional] HMENU hMenu,
		[Optional] HINSTANCE hInstance, [Optional] IntPtr lpParam)
		=> CreateWindowEx(0, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);

	/// <summary>
	/// Creates an overlapped, pop-up, or child window with an extended window style; otherwise, this function is identical to the
	/// CreateWindow function. For more information about creating a window and for full descriptions of the other parameters of
	/// <c>CreateWindowEx</c>, see <c>CreateWindow</c>.
	/// </summary>
	/// <param name="dwExStyle">
	/// The extended window style of the window being created. For a list of possible values,see Extended Window Styles.
	/// </param>
	/// <param name="lpClassName">
	/// A string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the
	/// low-order word of lpClassName; the high-order word must be zero. If lpClassName is a string, it specifies the window class name. The
	/// class name can be any name registered with <c>RegisterClass</c> or <c>RegisterClassEx</c>, provided that the module that registers
	/// the class is also the module that creates the window. The class name can also be any of the predefined system class names.
	/// </param>
	/// <param name="lpWindowName">
	/// The window name. If the window style specifies a title bar, the window title pointed to by lpWindowName is displayed in the title
	/// bar. When using CreateWindow to create controls, such as buttons, check boxes, and static controls, use lpWindowName to specify the
	/// text of the control. When creating a static control with the <c>SS_ICON</c> style, use lpWindowName to specify the icon name or
	/// identifier. To specify an identifier, use the syntax "#num".
	/// </param>
	/// <param name="dwStyle">
	/// The style of the window being created. This parameter can be a combination of the window style values, plus the control styles
	/// indicated in the Remarks section.
	/// </param>
	/// <param name="X">
	/// The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the
	/// window's upper-left corner, in screen coordinates. For a child window, x is the x-coordinate of the upper-left corner of the window
	/// relative to the upper-left corner of the parent window's client area. If x is set to <c>CW_USEDEFAULT</c>, the system selects the
	/// default position for the window's upper-left corner and ignores the y parameter. <c>CW_USEDEFAULT</c> is valid only for overlapped
	/// windows; if it is specified for a pop-up or child window, the x and y parameters are set to zero.
	/// </param>
	/// <param name="Y">
	/// <para>
	/// The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of
	/// the window's upper-left corner, in screen coordinates. For a child window, y is the initial y-coordinate of the upper-left corner of
	/// the child window relative to the upper-left corner of the parent window's client area. For a list box y is the initial y-coordinate
	/// of the upper-left corner of the list box's client area relative to the upper-left corner of the parent window's client area.
	/// </para>
	/// <para>
	/// If an overlapped window is created with the <c>WS_VISIBLE</c> style bit set and the x parameter is set to <c>CW_USEDEFAULT</c>, then
	/// the y parameter determines how the window is shown. If the y parameter is <c>CW_USEDEFAULT</c>, then the window manager calls
	/// ShowWindow with the <c>SW_SHOW</c> flag after the window has been created. If the y parameter is some other value, then the window
	/// manager calls <c>ShowWindow</c> with that value as the nCmdShow parameter.
	/// </para>
	/// </param>
	/// <param name="nWidth">
	/// The width, in device units, of the window. For overlapped windows, nWidth is the window's width, in screen coordinates, or
	/// <c>CW_USEDEFAULT</c>. If nWidth is <c>CW_USEDEFAULT</c>, the system selects a default width and height for the window; the default
	/// width extends from the initial x-coordinates to the right edge of the screen; the default height extends from the initial
	/// y-coordinate to the top of the icon area. <c>CW_USEDEFAULT</c> is valid only for overlapped windows; if <c>CW_USEDEFAULT</c> is
	/// specified for a pop-up or child window, the nWidth and nHeight parameter are set to zero.
	/// </param>
	/// <param name="nHeight">
	/// The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If the
	/// nWidth parameter is set to <c>CW_USEDEFAULT</c>, the system ignores nHeight.
	/// </param>
	/// <param name="hWndParent">
	/// <para>
	/// A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid
	/// window handle. This parameter is optional for pop-up windows.
	/// </para>
	/// <para>To create a message-only window, supply <c>HWND_MESSAGE</c> or a handle to an existing message-only window.</para>
	/// </param>
	/// <param name="hMenu">
	/// A handle to a menu, or specifies a child-window identifier, depending on the window style. For an overlapped or pop-up window, hMenu
	/// identifies the menu to be used with the window; it can be <c>NULL</c> if the class menu is to be used. For a child window, hMenu
	/// specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The
	/// application determines the child-window identifier; it must be unique for all child windows with the same parent window.
	/// </param>
	/// <param name="hInstance">A handle to the instance of the module to be associated with the window.</param>
	/// <param name="lpParam">
	/// <para>
	/// Pointer to a value to be passed to the window through the CREATESTRUCT structure ( <c>lpCreateParams</c> member) pointed to by the
	/// lParam param of the <c>WM_CREATE</c> message. This message is sent to the created window by this function before it returns.
	/// </para>
	/// <para>
	/// If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI
	/// client window calls <c>CreateWindow</c> to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam
	/// may be <c>NULL</c> if no additional data is needed.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>If the function succeeds, the return value is a handle to the new window.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// <para>This function typically fails for one of the following reasons:</para>
	/// <list type="bullet">
	/// <item>an invalid parameter value -</item>
	/// <item>the system class was registered by a different module -</item>
	/// <item>The <c>WH_CBT</c> hook is installed and returns a failure code -</item>
	/// <item>
	/// if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE -
	/// </item>
	/// </list>
	/// </returns>
	/// <remarks>
	/// <para>The <c>CreateWindowEx</c> function sends WM_NCCREATE, WM_NCCALCSIZE, and WM_CREATE messages to the window being created.</para>
	/// <para>
	/// If the created window is a child window, its default position is at the bottom of the Z-order. If the created window is a top-level
	/// window, its default position is at the top of the Z-order (but beneath all topmost windows unless the created window is itself topmost).
	/// </para>
	/// <para>For information on controlling whether the Taskbar displays a button for the created window, see Managing Taskbar Buttons.</para>
	/// <para>For information on removing a window, see the DestroyWindow function.</para>
	/// <para>
	/// The following predefined control classes can be specified in the lpClassName parameter. Note the corresponding control styles you can
	/// use in the dwStyle parameter.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Class</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <description>BUTTON</description>
	/// <description>
	/// Designates a small rectangular child window that represents a button the user can click to turn it on or off. Button controls can be
	/// used alone or in groups, and they can either be labeled or appear without text. Button controls typically change appearance when the
	/// user clicks them. For more information, see Buttons. For a table of the button styles you can specify in the dwStyle parameter, see
	/// Button Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>COMBOBOX</description>
	/// <description>
	/// Designates a control consisting of a list box and a selection field similar to an edit control. When using this style, an application
	/// should either display the list box at all times or enable a drop-down list box. If the list box is visible, typing characters into
	/// the selection field highlights the first list box entry that matches the characters typed. Conversely, selecting an item in the list
	/// box displays the selected text in the selection field. For more information, see Combo Boxes. For a table of the combo box styles you
	/// can specify in the dwStyle parameter, see Combo Box Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>EDIT</description>
	/// <description>
	/// Designates a rectangular child window into which the user can type text from the keyboard. The user selects the control and gives it
	/// the keyboard focus by clicking it or moving to it by pressing the TAB key. The user can type text when the edit control displays a
	/// flashing caret; use the mouse to move the cursor, select characters to be replaced, or position the cursor for inserting characters;
	/// or use the key to delete characters. For more information, see Edit Controls. For a table of the edit control styles you can specify
	/// in the dwStyle parameter, see Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>LISTBOX</description>
	/// <description>
	/// Designates a list of character strings. Specify this control whenever an application must present a list of names, such as filenames,
	/// from which the user can choose. The user can select a string by clicking it. A selected string is highlighted, and a notification
	/// message is passed to the parent window. For more information, see List Boxes. For a table of the list box styles you can specify in
	/// the dwStyle parameter, see List Box Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>MDICLIENT</description>
	/// <description>
	/// Designates an MDI client window. This window receives messages that control the MDI application's child windows. The recommended
	/// style bits are WS_CLIPCHILDREN and WS_CHILD. Specify the WS_HSCROLL and WS_VSCROLL styles to create an MDI client window that allows
	/// the user to scroll MDI child windows into view. For more information, see Multiple Document Interface.
	/// </description>
	/// </item>
	/// <item>
	/// <description>RichEdit</description>
	/// <description>
	/// Designates a Microsoft Rich Edit 1.0 control. This window lets the user view and edit text with character and paragraph formatting,
	/// and can include embedded Component Object Model (COM) objects. For more information, see Rich Edit Controls. For a table of the rich
	/// edit control styles you can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>RICHEDIT_CLASS</description>
	/// <description>
	/// Designates a Microsoft Rich Edit 2.0 control. This controls let the user view and edit text with character and paragraph formatting,
	/// and can include embedded COM objects. For more information, see Rich Edit Controls. For a table of the rich edit control styles you
	/// can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>SCROLLBAR</description>
	/// <description>
	/// Designates a rectangle that contains a scroll box and has direction arrows at both ends. The scroll bar sends a notification message
	/// to its parent window whenever the user clicks the control. The parent window is responsible for updating the position of the scroll
	/// box, if necessary. For more information, see Scroll Bars. For a table of the scroll bar control styles you can specify in the dwStyle
	/// parameter, see Scroll Bar Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>STATIC</description>
	/// <description>
	/// Designates a simple text field, box, or rectangle used to label, box, or separate other controls. Static controls take no input and
	/// provide no output. For more information, see Static Controls. For a table of the static control styles you can specify in the dwStyle
	/// parameter, see Static Control Styles.
	/// </description>
	/// </item>
	/// </list>
	/// <para>
	/// The <c>WS_EX_NOACTIVATE</c> value for dwExStyle prevents foreground activation by the system. To prevent queue activation when the
	/// user clicks on the window, you must process the WM_MOUSEACTIVATE message appropriately. To bring the window to the foreground or to
	/// activate it programmatically, use SetForegroundWindow or SetActiveWindow. Returning <c>FALSE</c> to WM_NCACTIVATE prevents the window
	/// from losing queue activation. However, the return value is ignored at activation time.
	/// </para>
	/// <para>
	/// With <c>WS_EX_COMPOSITED</c> set, all descendants of a window get bottom-to-top painting order using double-buffering. Bottom-to-top
	/// painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the
	/// descendent window also has the <c>WS_EX_TRANSPARENT</c> bit set. Double-buffering allows the window and its descendents to be painted
	/// without flicker.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-createwindowexa HWND CreateWindowExA( DWORD dwExStyle,
	// LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,
	// HINSTANCE hInstance, LPVOID lpParam );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "createwindowex")]
	public static extern SafeHWND CreateWindowEx([Optional] WindowStylesEx dwExStyle, [MarshalAs(UnmanagedType.LPTStr)] string lpClassName,
		[MarshalAs(UnmanagedType.LPTStr), Optional] string? lpWindowName, [Optional] WindowStyles dwStyle, [Optional] int X,
		[Optional] int Y, [Optional] int nWidth, [Optional] int nHeight, [Optional] HWND hWndParent, [Optional] HMENU hMenu,
		[Optional] HINSTANCE hInstance, [Optional] IntPtr lpParam);

	/// <summary>
	/// Creates an overlapped, pop-up, or child window with an extended window style; otherwise, this function is identical to the
	/// CreateWindow function. For more information about creating a window and for full descriptions of the other parameters of
	/// <c>CreateWindowEx</c>, see <c>CreateWindow</c>.
	/// </summary>
	/// <param name="dwExStyle">
	/// The extended window style of the window being created. For a list of possible values,see Extended Window Styles.
	/// </param>
	/// <param name="lpClassName">
	/// A string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the
	/// low-order word of lpClassName; the high-order word must be zero. If lpClassName is a string, it specifies the window class name. The
	/// class name can be any name registered with <c>RegisterClass</c> or <c>RegisterClassEx</c>, provided that the module that registers
	/// the class is also the module that creates the window. The class name can also be any of the predefined system class names.
	/// </param>
	/// <param name="lpWindowName">
	/// The window name. If the window style specifies a title bar, the window title pointed to by lpWindowName is displayed in the title
	/// bar. When using CreateWindow to create controls, such as buttons, check boxes, and static controls, use lpWindowName to specify the
	/// text of the control. When creating a static control with the <c>SS_ICON</c> style, use lpWindowName to specify the icon name or
	/// identifier. To specify an identifier, use the syntax "#num".
	/// </param>
	/// <param name="dwStyle">
	/// The style of the window being created. This parameter can be a combination of the window style values, plus the control styles
	/// indicated in the Remarks section.
	/// </param>
	/// <param name="X">
	/// The initial horizontal position of the window. For an overlapped or pop-up window, the x parameter is the initial x-coordinate of the
	/// window's upper-left corner, in screen coordinates. For a child window, x is the x-coordinate of the upper-left corner of the window
	/// relative to the upper-left corner of the parent window's client area. If x is set to <c>CW_USEDEFAULT</c>, the system selects the
	/// default position for the window's upper-left corner and ignores the y parameter. <c>CW_USEDEFAULT</c> is valid only for overlapped
	/// windows; if it is specified for a pop-up or child window, the x and y parameters are set to zero.
	/// </param>
	/// <param name="Y">
	/// <para>
	/// The initial vertical position of the window. For an overlapped or pop-up window, the y parameter is the initial y-coordinate of
	/// the window's upper-left corner, in screen coordinates. For a child window, y is the initial y-coordinate of the upper-left corner of
	/// the child window relative to the upper-left corner of the parent window's client area. For a list box y is the initial y-coordinate
	/// of the upper-left corner of the list box's client area relative to the upper-left corner of the parent window's client area.
	/// </para>
	/// <para>
	/// If an overlapped window is created with the <c>WS_VISIBLE</c> style bit set and the x parameter is set to <c>CW_USEDEFAULT</c>, then
	/// the y parameter determines how the window is shown. If the y parameter is <c>CW_USEDEFAULT</c>, then the window manager calls
	/// ShowWindow with the <c>SW_SHOW</c> flag after the window has been created. If the y parameter is some other value, then the window
	/// manager calls <c>ShowWindow</c> with that value as the nCmdShow parameter.
	/// </para>
	/// </param>
	/// <param name="nWidth">
	/// The width, in device units, of the window. For overlapped windows, nWidth is the window's width, in screen coordinates, or
	/// <c>CW_USEDEFAULT</c>. If nWidth is <c>CW_USEDEFAULT</c>, the system selects a default width and height for the window; the default
	/// width extends from the initial x-coordinates to the right edge of the screen; the default height extends from the initial
	/// y-coordinate to the top of the icon area. <c>CW_USEDEFAULT</c> is valid only for overlapped windows; if <c>CW_USEDEFAULT</c> is
	/// specified for a pop-up or child window, the nWidth and nHeight parameter are set to zero.
	/// </param>
	/// <param name="nHeight">
	/// The height, in device units, of the window. For overlapped windows, nHeight is the window's height, in screen coordinates. If the
	/// nWidth parameter is set to <c>CW_USEDEFAULT</c>, the system ignores nHeight.
	/// </param>
	/// <param name="hWndParent">
	/// <para>
	/// A handle to the parent or owner window of the window being created. To create a child window or an owned window, supply a valid
	/// window handle. This parameter is optional for pop-up windows.
	/// </para>
	/// <para>To create a message-only window, supply <c>HWND_MESSAGE</c> or a handle to an existing message-only window.</para>
	/// </param>
	/// <param name="hMenu">
	/// A handle to a menu, or specifies a child-window identifier, depending on the window style. For an overlapped or pop-up window, hMenu
	/// identifies the menu to be used with the window; it can be <c>NULL</c> if the class menu is to be used. For a child window, hMenu
	/// specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The
	/// application determines the child-window identifier; it must be unique for all child windows with the same parent window.
	/// </param>
	/// <param name="hInstance">A handle to the instance of the module to be associated with the window.</param>
	/// <param name="lpParam">
	/// <para>
	/// Pointer to a value to be passed to the window through the CREATESTRUCT structure ( <c>lpCreateParams</c> member) pointed to by the
	/// lParam param of the <c>WM_CREATE</c> message. This message is sent to the created window by this function before it returns.
	/// </para>
	/// <para>
	/// If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI
	/// client window calls <c>CreateWindow</c> to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam
	/// may be <c>NULL</c> if no additional data is needed.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>If the function succeeds, the return value is a handle to the new window.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// <para>This function typically fails for one of the following reasons:</para>
	/// <list type="bullet">
	/// <item>an invalid parameter value -</item>
	/// <item>the system class was registered by a different module -</item>
	/// <item>The <c>WH_CBT</c> hook is installed and returns a failure code -</item>
	/// <item>
	/// if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE -
	/// </item>
	/// </list>
	/// </returns>
	/// <remarks>
	/// <para>The <c>CreateWindowEx</c> function sends WM_NCCREATE, WM_NCCALCSIZE, and WM_CREATE messages to the window being created.</para>
	/// <para>
	/// If the created window is a child window, its default position is at the bottom of the Z-order. If the created window is a top-level
	/// window, its default position is at the top of the Z-order (but beneath all topmost windows unless the created window is itself topmost).
	/// </para>
	/// <para>For information on controlling whether the Taskbar displays a button for the created window, see Managing Taskbar Buttons.</para>
	/// <para>For information on removing a window, see the DestroyWindow function.</para>
	/// <para>
	/// The following predefined control classes can be specified in the lpClassName parameter. Note the corresponding control styles you can
	/// use in the dwStyle parameter.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Class</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <description>BUTTON</description>
	/// <description>
	/// Designates a small rectangular child window that represents a button the user can click to turn it on or off. Button controls can be
	/// used alone or in groups, and they can either be labeled or appear without text. Button controls typically change appearance when the
	/// user clicks them. For more information, see Buttons. For a table of the button styles you can specify in the dwStyle parameter, see
	/// Button Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>COMBOBOX</description>
	/// <description>
	/// Designates a control consisting of a list box and a selection field similar to an edit control. When using this style, an application
	/// should either display the list box at all times or enable a drop-down list box. If the list box is visible, typing characters into
	/// the selection field highlights the first list box entry that matches the characters typed. Conversely, selecting an item in the list
	/// box displays the selected text in the selection field. For more information, see Combo Boxes. For a table of the combo box styles you
	/// can specify in the dwStyle parameter, see Combo Box Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>EDIT</description>
	/// <description>
	/// Designates a rectangular child window into which the user can type text from the keyboard. The user selects the control and gives it
	/// the keyboard focus by clicking it or moving to it by pressing the TAB key. The user can type text when the edit control displays a
	/// flashing caret; use the mouse to move the cursor, select characters to be replaced, or position the cursor for inserting characters;
	/// or use the key to delete characters. For more information, see Edit Controls. For a table of the edit control styles you can specify
	/// in the dwStyle parameter, see Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>LISTBOX</description>
	/// <description>
	/// Designates a list of character strings. Specify this control whenever an application must present a list of names, such as filenames,
	/// from which the user can choose. The user can select a string by clicking it. A selected string is highlighted, and a notification
	/// message is passed to the parent window. For more information, see List Boxes. For a table of the list box styles you can specify in
	/// the dwStyle parameter, see List Box Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>MDICLIENT</description>
	/// <description>
	/// Designates an MDI client window. This window receives messages that control the MDI application's child windows. The recommended
	/// style bits are WS_CLIPCHILDREN and WS_CHILD. Specify the WS_HSCROLL and WS_VSCROLL styles to create an MDI client window that allows
	/// the user to scroll MDI child windows into view. For more information, see Multiple Document Interface.
	/// </description>
	/// </item>
	/// <item>
	/// <description>RichEdit</description>
	/// <description>
	/// Designates a Microsoft Rich Edit 1.0 control. This window lets the user view and edit text with character and paragraph formatting,
	/// and can include embedded Component Object Model (COM) objects. For more information, see Rich Edit Controls. For a table of the rich
	/// edit control styles you can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>RICHEDIT_CLASS</description>
	/// <description>
	/// Designates a Microsoft Rich Edit 2.0 control. This controls let the user view and edit text with character and paragraph formatting,
	/// and can include embedded COM objects. For more information, see Rich Edit Controls. For a table of the rich edit control styles you
	/// can specify in the dwStyle parameter, see Rich Edit Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>SCROLLBAR</description>
	/// <description>
	/// Designates a rectangle that contains a scroll box and has direction arrows at both ends. The scroll bar sends a notification message
	/// to its parent window whenever the user clicks the control. The parent window is responsible for updating the position of the scroll
	/// box, if necessary. For more information, see Scroll Bars. For a table of the scroll bar control styles you can specify in the dwStyle
	/// parameter, see Scroll Bar Control Styles.
	/// </description>
	/// </item>
	/// <item>
	/// <description>STATIC</description>
	/// <description>
	/// Designates a simple text field, box, or rectangle used to label, box, or separate other controls. Static controls take no input and
	/// provide no output. For more information, see Static Controls. For a table of the static control styles you can specify in the dwStyle
	/// parameter, see Static Control Styles.
	/// </description>
	/// </item>
	/// </list>
	/// <para>
	/// The <c>WS_EX_NOACTIVATE</c> value for dwExStyle prevents foreground activation by the system. To prevent queue activation when the
	/// user clicks on the window, you must process the WM_MOUSEACTIVATE message appropriately. To bring the window to the foreground or to
	/// activate it programmatically, use SetForegroundWindow or SetActiveWindow. Returning <c>FALSE</c> to WM_NCACTIVATE prevents the window
	/// from losing queue activation. However, the return value is ignored at activation time.
	/// </para>
	/// <para>
	/// With <c>WS_EX_COMPOSITED</c> set, all descendants of a window get bottom-to-top painting order using double-buffering. Bottom-to-top
	/// painting order allows a descendent window to have translucency (alpha) and transparency (color-key) effects, but only if the
	/// descendent window also has the <c>WS_EX_TRANSPARENT</c> bit set. Double-buffering allows the window and its descendents to be painted
	/// without flicker.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-createwindowexa HWND CreateWindowExA( DWORD dwExStyle,
	// LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,
	// HINSTANCE hInstance, LPVOID lpParam );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "createwindowex")]
	public static extern SafeHWND CreateWindowEx([Optional] WindowStylesEx dwExStyle, IntPtr lpClassName,
		[MarshalAs(UnmanagedType.LPTStr), Optional] string? lpWindowName, [Optional] WindowStyles dwStyle, [Optional] int X,
		[Optional] int Y, [Optional] int nWidth, [Optional] int nHeight, [Optional] HWND hWndParent, [Optional] HMENU hMenu,
		[Optional] HINSTANCE hInstance, [Optional] IntPtr lpParam);

	/// <summary>
	/// <para>
	/// Updates the specified multiple-window – position structure for the specified window. The function then returns a handle to the
	/// updated structure. The EndDeferWindowPos function uses the information in this structure to change the position and size of a
	/// number of windows simultaneously. The BeginDeferWindowPos function creates the structure.
	/// </para>
	/// </summary>
	/// <param name="hWinPosInfo">
	/// <para>Type: <c>HDWP</c></para>
	/// <para>
	/// A handle to a multiple-window – position structure that contains size and position information for one or more windows. This
	/// structure is returned by BeginDeferWindowPos or by the most recent call to <c>DeferWindowPos</c>.
	/// </para>
	/// </param>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window for which update information is stored in the structure. All windows in a multiple-window – position
	/// structure must have the same parent.
	/// </para>
	/// </param>
	/// <param name="hWndInsertAfter">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window that precedes the positioned window in the Z order. This parameter must be a window handle or one of the
	/// following values. This parameter is ignored if the <c>SWP_NOZORDER</c> flag is set in the uFlags parameter.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>HWND_BOTTOM ((HWND)1)</term>
	/// <term>
	/// Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window, the window loses its topmost
	/// status and is placed at the bottom of all other windows.
	/// </term>
	/// </item>
	/// <item>
	/// <term>HWND_NOTOPMOST ((HWND)-2)</term>
	/// <term>
	/// Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if the window is
	/// already a non-topmost window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>HWND_TOP ((HWND)0)</term>
	/// <term>Places the window at the top of the Z order.</term>
	/// </item>
	/// <item>
	/// <term>HWND_TOPMOST ((HWND)-1)</term>
	/// <term>Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="x">
	/// <para>Type: <c>int</c></para>
	/// <para>The x-coordinate of the window's upper-left corner.</para>
	/// </param>
	/// <param name="y">
	/// <para>Type: <c>int</c></para>
	/// <para>The y-coordinate of the window's upper-left corner.</para>
	/// </param>
	/// <param name="cx">
	/// <para>Type: <c>int</c></para>
	/// <para>The window's new width, in pixels.</para>
	/// </param>
	/// <param name="cy">
	/// <para>Type: <c>int</c></para>
	/// <para>The window's new height, in pixels.</para>
	/// </param>
	/// <param name="uFlags">
	/// <para>Type: <c>UINT</c></para>
	/// <para>A combination of the following values that affect the size and position of the window.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>SWP_DRAWFRAME 0x0020</term>
	/// <term>Draws a frame (defined in the window's class description) around the window.</term>
	/// </item>
	/// <item>
	/// <term>SWP_FRAMECHANGED 0x0020</term>
	/// <term>
	/// Sends a WM_NCCALCSIZE message to the window, even if the window's size is not being changed. If this flag is not specified,
	/// WM_NCCALCSIZE is sent only when the window's size is being changed.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_HIDEWINDOW 0x0080</term>
	/// <term>Hides the window.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOACTIVATE 0x0010</term>
	/// <term>
	/// Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or
	/// non-topmost group (depending on the setting of the hWndInsertAfter parameter).
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOCOPYBITS 0x0100</term>
	/// <term>
	/// Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client area are saved
	/// and copied back into the client area after the window is sized or repositioned.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOMOVE 0x0002</term>
	/// <term>Retains the current position (ignores the x and y parameters).</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOOWNERZORDER 0x0200</term>
	/// <term>Does not change the owner window's position in the Z order.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOREDRAW 0x0008</term>
	/// <term>
	/// Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area, the nonclient
	/// area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of the window being
	/// moved. When this flag is set, the application must explicitly invalidate or redraw any parts of the window and parent window that
	/// need redrawing.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOREPOSITION 0x0200</term>
	/// <term>Same as the SWP_NOOWNERZORDER flag.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOSENDCHANGING 0x0400</term>
	/// <term>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOSIZE 0x0001</term>
	/// <term>Retains the current size (ignores the cx and cy parameters).</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOZORDER 0x0004</term>
	/// <term>Retains the current Z order (ignores the hWndInsertAfter parameter).</term>
	/// </item>
	/// <item>
	/// <term>SWP_SHOWWINDOW 0x0040</term>
	/// <term>Displays the window.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HDWP</c></c></para>
	/// <para>
	/// The return value identifies the updated multiple-window – position structure. The handle returned by this function may differ
	/// from the handle passed to the function. The new handle that this function returns should be passed during the next call to the
	/// <c>DeferWindowPos</c> or EndDeferWindowPos function.
	/// </para>
	/// <para>
	/// If insufficient system resources are available for the function to succeed, the return value is <c>NULL</c>. To get extended
	/// error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If a call to <c>DeferWindowPos</c> fails, the application should abandon the window-positioning operation and not call EndDeferWindowPos.
	/// </para>
	/// <para>
	/// If <c>SWP_NOZORDER</c> is not specified, the system places the window identified by the hWnd parameter in the position following
	/// the window identified by the hWndInsertAfter parameter. If hWndInsertAfter is <c>NULL</c> or <c>HWND_TOP</c>, the system places
	/// the hWnd window at the top of the Z order. If hWndInsertAfter is set to <c>HWND_BOTTOM</c>, the system places the hWnd window at
	/// the bottom of the Z order.
	/// </para>
	/// <para>All coordinates for child windows are relative to the upper-left corner of the parent window's client area.</para>
	/// <para>
	/// A window can be made a topmost window either by setting hWndInsertAfter to the <c>HWND_TOPMOST</c> flag and ensuring that the
	/// <c>SWP_NOZORDER</c> flag is not set, or by setting the window's position in the Z order so that it is above any existing topmost
	/// windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed.
	/// </para>
	/// <para>
	/// If neither the <c>SWP_NOACTIVATE</c> nor <c>SWP_NOZORDER</c> flag is specified (that is, when the application requests that a
	/// window be simultaneously activated and its position in the Z order changed), the value specified in hWndInsertAfter is used only
	/// in the following circumstances:
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>Neither the <c>HWND_TOPMOST</c> nor <c>HWND_NOTOPMOST</c> flag is specified in hWndInsertAfter.</term>
	/// </item>
	/// <item>
	/// <term>The window identified by hWnd is not the active window.</term>
	/// </item>
	/// </list>
	/// <para>
	/// An application cannot activate an inactive window without also bringing it to the top of the Z order. An application can change
	/// an activated window's position in the Z order without restrictions, or it can activate a window and then move it to the top of
	/// the topmost or non-topmost windows.
	/// </para>
	/// <para>
	/// A topmost window is no longer topmost if it is repositioned to the bottom ( <c>HWND_BOTTOM</c>) of the Z order or after any
	/// non-topmost window. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows.
	/// </para>
	/// <para>
	/// A non-topmost window may own a topmost window, but not vice versa. Any window (for example, a dialog box) owned by a topmost
	/// window is itself made a topmost window to ensure that all owned windows stay above their owner.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-deferwindowpos HDWP DeferWindowPos( HDWP hWinPosInfo, HWND
	// hWnd, HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT uFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "deferwindowpos")]
	public static extern HDWP DeferWindowPos(HDWP hWinPosInfo, HWND hWnd, [Optional] HWND hWndInsertAfter, int x, int y, int cx, int cy, SetWindowPosFlags uFlags);

	/// <summary>
	/// Provides default processing for any window messages that the window procedure of a multiple-document interface (MDI) frame window
	/// does not process. All window messages that are not explicitly processed by the window procedure must be passed to the
	/// <c>DefFrameProc</c> function, not the DefWindowProc function.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the MDI frame window.</para>
	/// </param>
	/// <param name="hWndMDIClient">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the MDI client window.</para>
	/// </param>
	/// <param name="uMsg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message to be processed.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message-specific information.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message-specific information.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>LRESULT</c></c></para>
	/// <para>
	/// The return value specifies the result of the message processing and depends on the message. If the hWndMDIClient parameter is
	/// <c>NULL</c>, the return value is the same as for the DefWindowProc function.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// When an application's window procedure does not handle a message, it typically passes the message to the DefWindowProc function
	/// to process the message. MDI applications use the <c>DefFrameProc</c> and DefMDIChildProc functions instead of
	/// <c>DefWindowProc</c> to provide default message processing. All messages that an application would usually pass to
	/// <c>DefWindowProc</c> (such as nonclient messages and the WM_SETTEXT message) should be passed to <c>DefFrameProc</c> instead. The
	/// <c>DefFrameProc</c> function also handles the following messages.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Message</term>
	/// <term>Response</term>
	/// </listheader>
	/// <item>
	/// <term>WM_COMMAND</term>
	/// <term>
	/// Activates the MDI child window that the user chooses. This message is sent when the user chooses an MDI child window from the
	/// window menu of the MDI frame window. The window identifier accompanying this message identifies the MDI child window to be activated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>WM_MENUCHAR</term>
	/// <term>Opens the window menu of the active MDI child window when the user presses the ALT+ – (minus) key combination.</term>
	/// </item>
	/// <item>
	/// <term>WM_SETFOCUS</term>
	/// <term>Passes the keyboard focus to the MDI client window, which in turn passes it to the active MDI child window.</term>
	/// </item>
	/// <item>
	/// <term>WM_SIZE</term>
	/// <term>
	/// Resizes the MDI client window to fit in the new frame window's client area. If the frame window procedure sizes the MDI client
	/// window to a different size, it should not pass the message to the DefWindowProc function.
	/// </term>
	/// </item>
	/// </list>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-defframeproca LRESULT DefFrameProcA( HWND hWnd, HWND
	// hWndMDIClient, UINT uMsg, WPARAM wParam, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h")]
	public static extern IntPtr DefFrameProc(HWND hWnd, [Optional] HWND hWndMDIClient, uint uMsg, IntPtr wParam, IntPtr lParam);

	/// <summary>
	/// Provides default processing for any window message that the window procedure of a multiple-document interface (MDI) child window
	/// does not process. A window message not processed by the window procedure must be passed to the <c>DefMDIChildProc</c> function,
	/// not to the DefWindowProc function.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the MDI child window.</para>
	/// </param>
	/// <param name="uMsg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message to be processed.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message-specific information.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message-specific information.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>LRESULT</c></c></para>
	/// <para>The return value specifies the result of the message processing and depends on the message.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>DefMDIChildProc</c> function assumes that the parent window of the MDI child window identified by the hWnd parameter was
	/// created with the <c>MDICLIENT</c> class.
	/// </para>
	/// <para>
	/// When an application's window procedure does not handle a message, it typically passes the message to the DefWindowProc function
	/// to process the message. MDI applications use the DefFrameProc and <c>DefMDIChildProc</c> functions instead of
	/// <c>DefWindowProc</c> to provide default message processing. All messages that an application would usually pass to
	/// <c>DefWindowProc</c> (such as nonclient messages and the WM_SETTEXT message) should be passed to <c>DefMDIChildProc</c> instead.
	/// In addition, <c>DefMDIChildProc</c> also handles the following messages.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Message</term>
	/// <term>Response</term>
	/// </listheader>
	/// <item>
	/// <term>WM_CHILDACTIVATE</term>
	/// <term>Performs activation processing when MDI child windows are sized, moved, or displayed. This message must be passed.</term>
	/// </item>
	/// <item>
	/// <term>WM_GETMINMAXINFO</term>
	/// <term>Calculates the size of a maximized MDI child window, based on the current size of the MDI client window.</term>
	/// </item>
	/// <item>
	/// <term>WM_MENUCHAR</term>
	/// <term>Passes the message to the MDI frame window.</term>
	/// </item>
	/// <item>
	/// <term>WM_MOVE</term>
	/// <term>Recalculates MDI client scroll bars if they are present.</term>
	/// </item>
	/// <item>
	/// <term>WM_SETFOCUS</term>
	/// <term>Activates the child window if it is not the active MDI child window.</term>
	/// </item>
	/// <item>
	/// <term>WM_SIZE</term>
	/// <term>
	/// Performs operations necessary for changing the size of a window, especially for maximizing or restoring an MDI child window.
	/// Failing to pass this message to the DefMDIChildProc function produces highly undesirable results.
	/// </term>
	/// </item>
	/// <item>
	/// <term>WM_SYSCOMMAND</term>
	/// <term>Handles window menu commands: SC_NEXTWINDOW, SC_PREVWINDOW, SC_MOVE, SC_SIZE, and SC_MAXIMIZE.</term>
	/// </item>
	/// </list>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-defmdichildproca LRESULT LRESULT DefMDIChildProcA( HWND
	// hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h")]
	public static extern IntPtr DefMDIChildProc(HWND hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);

	/// <summary>
	/// Calls the default window procedure to provide default processing for any window messages that an application does not process.
	/// This function ensures that every message is processed. <c>DefWindowProc</c> is called with the same parameters received by the
	/// window procedure.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window procedure that received the message.</para>
	/// </param>
	/// <param name="Msg">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The message.</para>
	/// </param>
	/// <param name="wParam">
	/// <para>Type: <c>WPARAM</c></para>
	/// <para>Additional message information. The content of this parameter depends on the value of the Msg parameter.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>Additional message information. The content of this parameter depends on the value of the Msg parameter.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>LRESULT</c></c></para>
	/// <para>The return value is the result of the message processing and depends on the message.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-defwindowproca LRESULT LRESULT DefWindowProcA( HWND hWnd,
	// UINT Msg, WPARAM wParam, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h")]
	public static extern IntPtr DefWindowProc(HWND hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>Unregisters a specified Shell window that is registered to receive Shell hook messages.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be unregistered. The window was registered with a call to the RegisterShellHookWindow function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para><c>TRUE</c> if the function succeeds; <c>FALSE</c> if the function fails.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server
	/// 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-deregistershellhookwindow BOOL DeregisterShellHookWindow(
	// HWND hwnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "deregistershellhookwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool DeregisterShellHookWindow(HWND hwnd);

	/// <summary>
	/// <para>
	/// Destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove
	/// the keyboard focus from it. The function also destroys the window's menu, flushes the thread message queue, destroys timers,
	/// removes clipboard ownership, and breaks the clipboard viewer chain (if the window is at the top of the viewer chain).
	/// </para>
	/// <para>
	/// If the specified window is a parent or owner window, <c>DestroyWindow</c> automatically destroys the associated child or owned
	/// windows when it destroys the parent or owner window. The function first destroys child or owned windows, and then it destroys the
	/// parent or owner window.
	/// </para>
	/// <para><c>DestroyWindow</c> also destroys modeless dialog boxes created by the CreateDialog function.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be destroyed.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>A thread cannot use <c>DestroyWindow</c> to destroy a window created by a different thread.</para>
	/// <para>
	/// If the window being destroyed is a child window that does not have the <c>WS_EX_NOPARENTNOTIFY</c> style, a WM_PARENTNOTIFY
	/// message is sent to the parent.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Destroying a Window.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-destroywindow BOOL DestroyWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "destroywindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool DestroyWindow(HWND hWnd);

	/// <summary>
	/// Disables the window ghosting feature for the calling GUI process. Window ghosting is a Windows Manager feature that lets the user
	/// minimize, move, or close the main window of an application that is not responding.
	/// </summary>
	/// <remarks>After calling <c>DisableProcessWindowsGhosting</c>, the ghosting feature is disabled for the duration of the process.</remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-disableprocesswindowsghosting void
	// DisableProcessWindowsGhosting( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern void DisableProcessWindowsGhosting();

	/// <summary>
	/// Captures the mouse and tracks its movement until the user releases the left button, presses the ESC key, or moves the mouse
	/// outside the drag rectangle around the specified point. The width and height of the drag rectangle are specified by the
	/// <c>SM_CXDRAG</c> and <c>SM_CYDRAG</c> values returned by the GetSystemMetrics function.
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window receiving mouse input.</para>
	/// </param>
	/// <param name="pt">
	/// <para>Type: <c>POINT</c></para>
	/// <para>
	/// Initial position of the mouse, in screen coordinates. The function determines the coordinates of the drag rectangle by using this point.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If the user moved the mouse outside of the drag rectangle while holding down the left button, the return value is nonzero.</para>
	/// <para>
	/// If the user did not move the mouse outside of the drag rectangle while holding down the left button, the return value is zero.
	/// </para>
	/// </returns>
	/// <remarks>The system metrics for the drag rectangle are configurable, allowing for larger or smaller drag rectangles.</remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-dragdetect BOOL DragDetect( HWND hwnd, POINT pt );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool DragDetect(HWND hwnd, POINT pt);

	/// <summary>
	/// Enables or disables mouse and keyboard input to the specified window or control. When input is disabled, the window does not
	/// receive input such as mouse clicks and key presses. When input is enabled, the window receives all input.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be enabled or disabled.</para>
	/// </param>
	/// <param name="bEnable">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>
	/// Indicates whether to enable or disable the window. If this parameter is <c>TRUE</c>, the window is enabled. If the parameter is
	/// <c>FALSE</c>, the window is disabled.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If the window was previously disabled, the return value is nonzero.</para>
	/// <para>If the window was not previously disabled, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the window is being disabled, the system sends a WM_CANCELMODE message. If the enabled state of a window is changing, the
	/// system sends a WM_ENABLE message after the <c>WM_CANCELMODE</c> message. (These messages are sent before <c>EnableWindow</c>
	/// returns.) If a window is already disabled, its child windows are implicitly disabled, although they are not sent a
	/// <c>WM_ENABLE</c> message.
	/// </para>
	/// <para>
	/// A window must be enabled before it can be activated. For example, if an application is displaying a modeless dialog box and has
	/// disabled its main window, the application must enable the main window before destroying the dialog box. Otherwise, another window
	/// will receive the keyboard focus and be activated. If a child window is disabled, it is ignored when the system tries to determine
	/// which window should receive mouse messages.
	/// </para>
	/// <para>
	/// By default, a window is enabled when it is created. To create a window that is initially disabled, an application can specify the
	/// <c>WS_DISABLED</c> style in the CreateWindow or CreateWindowEx function. After a window has been created, an application can use
	/// <c>EnableWindow</c> to enable or disable the window.
	/// </para>
	/// <para>
	/// An application can use this function to enable or disable a control in a dialog box. A disabled control cannot receive the
	/// keyboard focus, nor can a user gain access to it.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enablewindow BOOL EnableWindow( HWND hWnd, BOOL bEnable );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EnableWindow(HWND hWnd, [MarshalAs(UnmanagedType.Bool)] bool bEnable);

	/// <summary>
	/// <para>Simultaneously updates the position and size of one or more windows in a single screen-refreshing cycle.</para>
	/// </summary>
	/// <param name="hWinPosInfo">
	/// <para>Type: <c>HDWP</c></para>
	/// <para>
	/// A handle to a multiple-window – position structure that contains size and position information for one or more windows. This
	/// internal structure is returned by the BeginDeferWindowPos function or by the most recent call to the DeferWindowPos function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>EndDeferWindowPos</c> function sends the WM_WINDOWPOSCHANGING and WM_WINDOWPOSCHANGED messages to each window identified
	/// in the internal structure.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enddeferwindowpos BOOL EndDeferWindowPos( HDWP hWinPosInfo );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "enddeferwindowpos")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EndDeferWindowPos(IntPtr hWinPosInfo);

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>Forcibly closes the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be closed.</para>
	/// </param>
	/// <param name="fShutDown">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>Ignored. Must be <c>FALSE</c>.</para>
	/// </param>
	/// <param name="fForce">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>
	/// A <c>TRUE</c> for this parameter will force the destruction of the window if an initial attempt fails to gently close the window
	/// using WM_CLOSE. With a <c>FALSE</c> for this parameter, only the close with <c>WM_CLOSE</c> is attempted.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is <c>FALSE</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server
	/// 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-endtask BOOL EndTask( HWND hWnd, BOOL fShutDown, BOOL
	// fForce );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "endtask")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EndTask(HWND hWnd, [MarshalAs(UnmanagedType.Bool)] bool fShutDown, [MarshalAs(UnmanagedType.Bool)] bool fForce);

	/// <summary>
	/// Enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to
	/// an application-defined callback function. <c>EnumChildWindows</c> continues until the last child window is enumerated or the
	/// callback function returns <c>FALSE</c>.
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the parent window whose child windows are to be enumerated. If this parameter is <c>NULL</c>, this function is
	/// equivalent to EnumWindows.
	/// </para>
	/// </param>
	/// <param name="lpEnumFunc">
	/// <para>Type: <c>WNDENUMPROC</c></para>
	/// <para>A pointer to an application-defined callback function. For more information, see EnumChildProc.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>An application-defined value to be passed to the callback function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>The return value is not used.</para>
	/// </returns>
	/// <remarks>
	/// <para>If a child window has created child windows of its own, <c>EnumChildWindows</c> enumerates those windows as well.</para>
	/// <para>
	/// A child window that is moved or repositioned in the Z order during the enumeration process will be properly enumerated. The
	/// function does not enumerate a child window that is destroyed before being enumerated or that is created during the enumeration process.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumchildwindows BOOL EnumChildWindows( HWND hWndParent,
	// WNDENUMPROC lpEnumFunc, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "enumchildwindows")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EnumChildWindows([Optional] HWND hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

	/// <summary>
	/// Enumerates the child windows that belong to the specified parent window by passing the handle to each child window, in turn, to
	/// an application-defined callback function. <c>EnumChildWindows</c> continues until the last child window is enumerated or the
	/// callback function returns <c>FALSE</c>.
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the parent window whose child windows are to be enumerated. If this parameter is <see cref="HWND.NULL"/>, this
	/// function is equivalent to EnumWindows.
	/// </para>
	/// </param>
	/// <returns>An ordered sequence of child window handles.</returns>
	public static IReadOnlyList<HWND> EnumChildWindows(this HWND hWndParent)
	{
		var children = new List<HWND>();
		Win32Error.ThrowLastErrorIfFalse(EnumChildWindows(hWndParent, EnumProc, default));
		return children;

		bool EnumProc(HWND hwnd, IntPtr lParam) { children.Add(hwnd); return true; }
	}

	/// <summary>
	/// <para>
	/// Enumerates all nonchild windows associated with a thread by passing the handle to each window, in turn, to an application-defined
	/// callback function. <c>EnumThreadWindows</c> continues until the last window is enumerated or the callback function returns
	/// <c>FALSE</c>. To enumerate child windows of a particular window, use the EnumChildWindows function.
	/// </para>
	/// </summary>
	/// <param name="dwThreadId">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The identifier of the thread whose windows are to be enumerated.</para>
	/// </param>
	/// <param name="lpfn">
	/// <para>Type: <c>WNDENUMPROC</c></para>
	/// <para>A pointer to an application-defined callback function. For more information, see EnumThreadWndProc.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>An application-defined value to be passed to the callback function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// If the callback function returns <c>TRUE</c> for all windows in the thread specified by dwThreadId, the return value is
	/// <c>TRUE</c>. If the callback function returns <c>FALSE</c> on any enumerated window, or if there are no windows found in the
	/// thread specified by dwThreadId, the return value is <c>FALSE</c>.
	/// </para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumthreadwindows BOOL EnumThreadWindows( DWORD
	// dwThreadId, WNDENUMPROC lpfn, LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "enumthreadwindows")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EnumThreadWindows(uint dwThreadId, EnumWindowsProc lpfn, IntPtr lParam);

	/// <summary>
	/// <para>
	/// Enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback
	/// function. <c>EnumWindows</c> continues until the last top-level window is enumerated or the callback function returns <c>FALSE</c>.
	/// </para>
	/// </summary>
	/// <param name="lpEnumFunc">
	/// <para>Type: <c>WNDENUMPROC</c></para>
	/// <para>A pointer to an application-defined callback function. For more information, see EnumWindowsProc.</para>
	/// </param>
	/// <param name="lParam">
	/// <para>Type: <c>LPARAM</c></para>
	/// <para>An application-defined value to be passed to the callback function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// <para>
	/// If EnumWindowsProc returns zero, the return value is also zero. In this case, the callback function should call SetLastError to
	/// obtain a meaningful error code to be returned to the caller of <c>EnumWindows</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>EnumWindows</c> function does not enumerate child windows, with the exception of a few top-level windows owned by the
	/// system that have the <c>WS_CHILD</c> style.
	/// </para>
	/// <para>
	/// This function is more reliable than calling the GetWindow function in a loop. An application that calls <c>GetWindow</c> to
	/// perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
	/// </para>
	/// <para><c>Note</c> For Windows 8 and later, <c>EnumWindows</c> enumerates only top-level windows of desktop apps.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumwindows BOOL EnumWindows( WNDENUMPROC lpEnumFunc,
	// LPARAM lParam );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "enumwindows")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

	/// <summary>
	/// <para>
	/// Retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not
	/// search child windows. This function does not perform a case-sensitive search.
	/// </para>
	/// <para>To search child windows, beginning with a specified child window, use the FindWindowEx function.</para>
	/// </summary>
	/// <param name="lpClassName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in
	/// the low-order word of lpClassName; the high-order word must be zero.
	/// </para>
	/// <para>
	/// If lpClassName points to a string, it specifies the window class name. The class name can be any name registered with
	/// RegisterClass or RegisterClassEx, or any of the predefined control-class names.
	/// </para>
	/// <para>If lpClassName is <c>NULL</c>, it finds any window whose title matches the lpWindowName parameter.</para>
	/// </param>
	/// <param name="lpWindowName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>The window name (the window's title). If this parameter is <c>NULL</c>, all window names match.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>If the function succeeds, the return value is a handle to the window that has the specified class name and window name.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the lpWindowName parameter is not <c>NULL</c>, <c>FindWindow</c> calls the GetWindowText function to retrieve the window name
	/// for comparison. For a description of a potential problem that can arise, see the Remarks for <c>GetWindowText</c>.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Retrieving the Number of Mouse Wheel Scroll Lines.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindowa HWND FindWindowA( LPCSTR lpClassName, LPCSTR
	// lpWindowName );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "findwindow")]
	public static extern HWND FindWindow([Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpClassName, [Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpWindowName);

	/// <summary>
	/// Retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows,
	/// beginning with the one following the specified child window. This function does not perform a case-sensitive search.
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window whose child windows are to be searched.</para>
	/// <para>
	/// If <c>hwndParent</c> is <c>NULL</c>, the function uses the desktop window as the parent window. The function searches among
	/// windows that are child windows of the desktop.
	/// </para>
	/// <para>If <c>hwndParent</c> is <c>HWND_MESSAGE</c>, the function searches all message-only windows.</para>
	/// </param>
	/// <param name="hWndChildAfter">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to a child window. The search begins with the next child window in the Z order. The child window must be a direct child
	/// window of <c>hwndParent</c>, not just a descendant window.
	/// </para>
	/// <para>If <c>hwndChildAfter</c> is <c>NULL</c>, the search begins with the first child window of <c>hwndParent</c>.</para>
	/// <para>
	/// Note that if both <c>hwndParent</c> and <c>hwndChildAfter</c> are <c>NULL</c>, the function searches all top-level and
	/// message-only windows.
	/// </para>
	/// </param>
	/// <param name="lpszClass">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be
	/// placed in the low-order word of <c>lpszClass</c>; the high-order word must be zero.
	/// </para>
	/// <para>
	/// If <c>lpszClass</c> is a string, it specifies the window class name. The class name can be any name registered with RegisterClass
	/// or RegisterClassEx, or any of the predefined control-class names, or it can be <c>MAKEINTATOM(0x8000)</c>. In this latter case,
	/// 0x8000 is the atom for a menu class. For more information, see the Remarks section of this topic.
	/// </para>
	/// </param>
	/// <param name="lpszWindow">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>The window name (the window's title). If this parameter is <c>NULL</c>, all window names match.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>If the function succeeds, the return value is a handle to the window that has the specified class and window names.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>The FindWindowEx function searches only direct child windows. It does not search other descendants.</para>
	/// <para>
	/// If the <c>lpszWindow</c> parameter is not <c>NULL</c>, <c>FindWindowEx</c> calls the GetWindowText function to retrieve the
	/// window name for comparison. For a description of a potential problem that can arise, see the Remarks section of <c>GetWindowText</c>.
	/// </para>
	/// <para>An application can call this function in the following way.</para>
	/// <para>
	/// Note that 0x8000 is the atom for a menu class. When an application calls this function, the function checks whether a context
	/// menu is being displayed that the application created.
	/// </para>
	/// <para>
	/// <para>Note</para>
	/// <para>
	/// The winuser.h header defines FindWindowEx as an alias which automatically selects the ANSI or Unicode version of this function
	/// based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not
	/// encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for
	/// Function Prototypes.
	/// </para>
	/// </para>
	/// </remarks>
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa
	// HWND FindWindowExA( [in, optional] HWND hWndParent, [in, optional] HWND hWndChildAfter, [in, optional] LPCSTR lpszClass, [in, optional] LPCSTR lpszWindow );
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.FindWindowExA")]
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	public static extern HWND FindWindowEx([In, Optional] HWND hWndParent, [In, Optional] HWND hWndChildAfter, [In, Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpszClass,
		[In, Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpszWindow);

	/// <summary>
	/// Retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows,
	/// beginning with the one following the specified child window. This function does not perform a case-sensitive search.
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window whose child windows are to be searched.</para>
	/// <para>
	/// If <c>hwndParent</c> is <c>NULL</c>, the function uses the desktop window as the parent window. The function searches among
	/// windows that are child windows of the desktop.
	/// </para>
	/// <para>If <c>hwndParent</c> is <c>HWND_MESSAGE</c>, the function searches all message-only windows.</para>
	/// </param>
	/// <param name="hWndChildAfter">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to a child window. The search begins with the next child window in the Z order. The child window must be a direct child
	/// window of <c>hwndParent</c>, not just a descendant window.
	/// </para>
	/// <para>If <c>hwndChildAfter</c> is <c>NULL</c>, the search begins with the first child window of <c>hwndParent</c>.</para>
	/// <para>
	/// Note that if both <c>hwndParent</c> and <c>hwndChildAfter</c> are <c>NULL</c>, the function searches all top-level and
	/// message-only windows.
	/// </para>
	/// </param>
	/// <param name="lpszClass">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be
	/// placed in the low-order word of <c>lpszClass</c>; the high-order word must be zero.
	/// </para>
	/// <para>
	/// If <c>lpszClass</c> is a string, it specifies the window class name. The class name can be any name registered with RegisterClass
	/// or RegisterClassEx, or any of the predefined control-class names, or it can be <c>MAKEINTATOM(0x8000)</c>. In this latter case,
	/// 0x8000 is the atom for a menu class. For more information, see the Remarks section of this topic.
	/// </para>
	/// </param>
	/// <param name="lpszWindow">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>The window name (the window's title). If this parameter is <c>NULL</c>, all window names match.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>If the function succeeds, the return value is a handle to the window that has the specified class and window names.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>The FindWindowEx function searches only direct child windows. It does not search other descendants.</para>
	/// <para>
	/// If the <c>lpszWindow</c> parameter is not <c>NULL</c>, <c>FindWindowEx</c> calls the GetWindowText function to retrieve the
	/// window name for comparison. For a description of a potential problem that can arise, see the Remarks section of <c>GetWindowText</c>.
	/// </para>
	/// <para>An application can call this function in the following way.</para>
	/// <para>
	/// Note that 0x8000 is the atom for a menu class. When an application calls this function, the function checks whether a context
	/// menu is being displayed that the application created.
	/// </para>
	/// <para>
	/// <para>Note</para>
	/// <para>
	/// The winuser.h header defines FindWindowEx as an alias which automatically selects the ANSI or Unicode version of this function
	/// based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not
	/// encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for
	/// Function Prototypes.
	/// </para>
	/// </para>
	/// </remarks>
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindowexa
	// HWND FindWindowExA( [in, optional] HWND hWndParent, [in, optional] HWND hWndChildAfter, [in, optional] LPCSTR lpszClass, [in, optional] LPCSTR lpszWindow );
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.FindWindowExA")]
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	public static extern HWND FindWindowEx([In, Optional] HWND hWndParent, [In, Optional] HWND hWndChildAfter, [In, Optional] IntPtr lpszClass,
		[In, Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpszWindow);

	/// <summary>
	/// <para>Flashes the specified window one time. It does not change the active state of the window.</para>
	/// <para>To flash the window a specified number of times, use the FlashWindowEx function.</para>
	/// </summary>
	/// <param name="hWnd">A handle to the window to be flashed. The window can be either open or minimized.</param>
	/// <param name="bInvert">
	/// <para>
	/// If this parameter is <c>TRUE</c>, the window is flashed from one state to the other. If it is <c>FALSE</c>, the window is
	/// returned to its original state (either active or inactive).
	/// </para>
	/// <para>
	/// When an application is minimized and this parameter is <c>TRUE</c>, the taskbar window button flashes active/inactive. If it is
	/// <c>FALSE</c>, the taskbar window button flashes inactive, meaning that it does not change colors. It flashes, as if it were being
	/// redrawn, but it does not provide the visual invert clue to the user.
	/// </para>
	/// </param>
	/// <returns>
	/// The return value specifies the window's state before the call to the <c>FlashWindow</c> function. If the window caption was drawn
	/// as active before the call, the return value is nonzero. Otherwise, the return value is zero.
	/// </returns>
	/// <remarks>
	/// <para>
	/// Flashing a window means changing the appearance of its caption bar as if the window were changing from inactive to active status,
	/// or vice versa. (An inactive caption bar changes to an active caption bar; an active caption bar changes to an inactive caption bar.)
	/// </para>
	/// <para>
	/// Typically, a window is flashed to inform the user that the window requires attention but that it does not currently have the
	/// keyboard focus.
	/// </para>
	/// <para>
	/// The <c>FlashWindow</c> function flashes the window only once; for repeated flashing, the application should create a system timer.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-flashwindow BOOL FlashWindow( HWND hWnd, BOOL bInvert );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "c4af997d-5cb8-4d5d-ae8d-1e0cc724fe02")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool FlashWindow(HWND hWnd, [MarshalAs(UnmanagedType.Bool)] bool bInvert);

	/// <summary>Flashes the specified window. It does not change the active state of the window.</summary>
	/// <param name="pfwi">A pointer to a FLASHWINFO structure.</param>
	/// <returns>
	/// The return value specifies the window's state before the call to the <c>FlashWindowEx</c> function. If the window caption was
	/// drawn as active before the call, the return value is nonzero. Otherwise, the return value is zero.
	/// </returns>
	/// <remarks>
	/// Typically, you flash a window to inform the user that the window requires attention but does not currently have the keyboard
	/// focus. When a window flashes, it appears to change from inactive to active status. An inactive caption bar changes to an active
	/// caption bar; an active caption bar changes to an inactive caption bar.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-flashwindowex BOOL FlashWindowEx( PFLASHWINFO pfwi );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "474ec2d9-3ee9-4622-843e-d6ae36fedd7f")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool FlashWindowEx(in FLASHWINFO pfwi);

	/// <summary>
	/// <para>Retrieves the window handle to the active window attached to the calling thread's message queue.</para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// The return value is the handle to the active window attached to the calling thread's message queue. Otherwise, the return value
	/// is <c>NULL</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>To get the handle to the foreground window, you can use GetForegroundWindow.</para>
	/// <para>To get the window handle to the active window in the message queue for another thread, use GetGUIThreadInfo.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getactivewindow HWND GetActiveWindow( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getactivewindow")]
	public static extern HWND GetActiveWindow();

	/// <summary>
	/// <para>Retrieves status information for the specified window if it is the application-switching (ALT+TAB) window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window for which status information will be retrieved. This window must be the application-switching window.</para>
	/// </param>
	/// <param name="iItem">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The index of the icon in the application-switching window. If the pszItemText parameter is not <c>NULL</c>, the name of the item
	/// is copied to the pszItemText string. If this parameter is –1, the name of the item is not copied.
	/// </para>
	/// </param>
	/// <param name="pati">
	/// <para>Type: <c>PALTTABINFO</c></para>
	/// <para>
	/// A pointer to an ALTTABINFO structure to receive the status information. Note that you must set the <c>csSize</c> member to before
	/// calling this function.
	/// </para>
	/// </param>
	/// <param name="pszItemText">
	/// <para>Type: <c>LPTSTR</c></para>
	/// <para>The name of the item. If this parameter is <c>NULL</c>, the name of the item is not copied.</para>
	/// </param>
	/// <param name="cchItemText">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The size, in characters, of the pszItemText buffer.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The application-switching window enables you to switch to the most recently used application window. To display the
	/// application-switching window, press ALT+TAB. To select an application from the list, continue to hold ALT down and press TAB to
	/// move through the list. Add SHIFT to reverse direction through the list.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getalttabinfoa BOOL GetAltTabInfoA( HWND hwnd, int iItem,
	// PALTTABINFO pati, LPSTR pszItemText, UINT cchItemText );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "getalttabinfo")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetAltTabInfo(HWND hwnd, int iItem, ref ALTTABINFO pati, [Optional] StringBuilder? pszItemText, uint cchItemText);

	/// <summary>
	/// <para>Retrieves the handle to the ancestor of the specified window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window whose ancestor is to be retrieved. If this parameter is the desktop window, the function returns <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="gaFlags">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The ancestor to be retrieved. This parameter can be one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GA_PARENT 1</term>
	/// <term>Retrieves the parent window. This does not include the owner, as it does with the GetParent function.</term>
	/// </item>
	/// <item>
	/// <term>GA_ROOT 2</term>
	/// <term>Retrieves the root window by walking the chain of parent windows.</term>
	/// </item>
	/// <item>
	/// <term>GA_ROOTOWNER 3</term>
	/// <term>Retrieves the owned root window by walking the chain of parent and owner windows returned by GetParent.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>The return value is the handle to the ancestor window.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getancestor HWND GetAncestor( HWND hwnd, UINT gaFlags );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getancestor")]
	public static extern HWND GetAncestor(HWND hwnd, GetAncestorFlag gaFlags);

	/// <summary>
	/// Retrieves a handle to the window (if any) that has captured the mouse. Only one window at a time can capture the mouse; this
	/// window receives mouse input whether or not the cursor is within its borders.
	/// </summary>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// The return value is a handle to the capture window associated with the current thread. If no window in the thread has captured
	/// the mouse, the return value is <c>NULL</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// A <c>NULL</c> return value means the current thread has not captured the mouse. However, it is possible that another thread or
	/// process has captured the mouse.
	/// </para>
	/// <para>To get a handle to the capture window on another thread, use the GetGUIThreadInfo function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getcapture HWND GetCapture( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND GetCapture();

	/// <summary>
	/// Retrieves the child window at the top of the Z order, if the specified window is a parent window; otherwise, the retrieved
	/// handle is NULL. The function examines only child windows of the specified window. It does not examine descendant windows.
	/// </summary>
	/// <param name="hWnd">A handle to a window.</param>
	/// <returns>
	/// If the function succeeds, the return value is a window handle. If no window exists with the specified relationship to the
	/// specified window, the return value is NULL. To get extended error information, call GetLastError.
	/// </returns>
	public static HWND GetChildWindow(this HWND hWnd) => GetWindow(hWnd, GetWindowCmd.GW_CHILD);

	/// <summary>
	/// <para>Retrieves information about a window class.</para>
	/// <para>
	/// <c>Note</c> The <c>GetClassInfo</c> function has been superseded by the GetClassInfoEx function. You can still use
	/// <c>GetClassInfo</c>, however, if you do not need information about the class small icon.
	/// </para>
	/// </summary>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>
	/// A handle to the instance of the application that created the class. To retrieve information about classes defined by the system
	/// (such as buttons or list boxes), set this parameter to <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="lpClassName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name. The name must be that of a preregistered class or a class registered by a previous call to the RegisterClass or
	/// RegisterClassEx function.
	/// </para>
	/// <para>
	/// Alternatively, this parameter can be an atom. If so, it must be a class atom created by a previous call to RegisterClass or
	/// RegisterClassEx. The atom must be in the low-order word of lpClassName; the high-order word must be zero.
	/// </para>
	/// </param>
	/// <param name="lpWndClass">
	/// <para>Type: <c>LPWNDCLASS</c></para>
	/// <para>A pointer to a WNDCLASS structure that receives the information about the class.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function finds a matching class and successfully copies the data, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclassinfoa BOOL GetClassInfoA( HINSTANCE hInstance,
	// LPCSTR lpClassName, LPWNDCLASSA lpWndClass );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetClassInfo([In, Optional] HINSTANCE hInstance, [MarshalAs(UnmanagedType.LPTStr)] string lpClassName, out WNDCLASS lpWndClass);

	/// <summary>
	/// <para>
	/// Retrieves information about a window class, including a handle to the small icon associated with the window class. The
	/// GetClassInfo function does not retrieve a handle to the small icon.
	/// </para>
	/// </summary>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>
	/// A handle to the instance of the application that created the class. To retrieve information about classes defined by the system
	/// (such as buttons or list boxes), set this parameter to <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="lpszClass">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name. The name must be that of a preregistered class or a class registered by a previous call to the RegisterClass or
	/// RegisterClassEx function. Alternatively, this parameter can be a class atom created by a previous call to <c>RegisterClass</c> or
	/// <c>RegisterClassEx</c>. The atom must be in the low-order word of lpszClass; the high-order word must be zero.
	/// </para>
	/// </param>
	/// <param name="lpwcx">
	/// <para>Type: <c>LPWNDCLASSEX</c></para>
	/// <para>A pointer to a WNDCLASSEX structure that receives the information about the class.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function finds a matching class and successfully copies the data, the return value is nonzero.</para>
	/// <para>
	/// If the function does not find a matching class and successfully copy the data, the return value is zero. To get extended error
	/// information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>Class atoms are created using the RegisterClass or RegisterClassEx function, not the GlobalAddAtom function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclassinfoexa BOOL GetClassInfoExA( HINSTANCE hInstance,
	// LPCSTR lpszClass, LPWNDCLASSEXA lpwcx );
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static bool GetClassInfoEx([In] HINSTANCE hInstance, string lpszClass, out WNDCLASSEX lpwcx)
	{
		WNDCLASSEXB wc = new();
		var ret = GetClassInfoEx(hInstance, lpszClass, ref wc);
		lpwcx = wc;
		return ret;
	}

	/// <summary>
	/// <para>
	/// Retrieves information about a window class, including a handle to the small icon associated with the window class. The
	/// GetClassInfo function does not retrieve a handle to the small icon.
	/// </para>
	/// </summary>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>
	/// A handle to the instance of the application that created the class. To retrieve information about classes defined by the system
	/// (such as buttons or list boxes), set this parameter to <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="lpszClass">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// The class name. The name must be that of a preregistered class or a class registered by a previous call to the RegisterClass or
	/// RegisterClassEx function. Alternatively, this parameter can be a class atom created by a previous call to <c>RegisterClass</c> or
	/// <c>RegisterClassEx</c>. The atom must be in the low-order word of lpszClass; the high-order word must be zero.
	/// </para>
	/// </param>
	/// <param name="lpwcx">
	/// <para>Type: <c>LPWNDCLASSEX</c></para>
	/// <para>A pointer to a WNDCLASSEX structure that receives the information about the class.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function finds a matching class and successfully copies the data, the return value is nonzero.</para>
	/// <para>
	/// If the function does not find a matching class and successfully copy the data, the return value is zero. To get extended error
	/// information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>Class atoms are created using the RegisterClass or RegisterClassEx function, not the GlobalAddAtom function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclassinfoexa BOOL GetClassInfoExA( HINSTANCE hInstance,
	// LPCSTR lpszClass, LPWNDCLASSEXA lpwcx );
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static bool GetClassInfoEx([In] HINSTANCE hInstance, IntPtr lpszClass, out WNDCLASSEX lpwcx)
	{
		WNDCLASSEXB wc = new();
		var ret = GetClassInfoEx(hInstance, lpszClass, ref wc);
		lpwcx = wc;
		return ret;
	}

	/// <summary>
	/// <para>Retrieves the specified value from the WNDCLASSEX structure associated with the specified window.</para>
	/// <para>
	/// <c>Note</c> To write code that is compatible with both 32-bit and 64-bit versions of Windows, use <c>GetClassLongPtr</c>. When
	/// compiling for 32-bit Windows, <c>GetClassLongPtr</c> is defined as a call to the GetClassLong function.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be retrieved. To retrieve a value from the extra class memory, specify the positive, zero-based byte offset of the
	/// value to be retrieved. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for
	/// example, if you specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To
	/// retrieve any other value from the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCW_ATOM -32</term>
	/// <term>
	/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClassEx function returns.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>Retrieves the size, in bytes, of the extra memory associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Retrieves the size, in bytes, of the extra window memory associated with each window in the class. For information on how to
	/// access this memory, see GetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_HBRBACKGROUND -10</term>
	/// <term>Retrieves a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Retrieves a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Retrieves a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Retrieves a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Retrieves the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Retrieves the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>
	/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
	/// CallWindowProc function to call the window procedure.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>If the function succeeds, the return value is the requested value.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </remarks>
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static IntPtr GetClassLong(HWND hWnd, int nIndex) => IntPtr.Size > 4 ? GetClassLongPtr(hWnd, nIndex) : (IntPtr)GetClassLong32(hWnd, nIndex);

	/// <summary>
	/// <para>Retrieves the specified value from the WNDCLASSEX structure associated with the specified window.</para>
	/// <para>
	/// <c>Note</c> To write code that is compatible with both 32-bit and 64-bit versions of Windows, use <c>GetClassLongPtr</c>. When
	/// compiling for 32-bit Windows, <c>GetClassLongPtr</c> is defined as a call to the GetClassLong function.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be retrieved. To retrieve a value from the extra class memory, specify the positive, zero-based byte offset of the
	/// value to be retrieved. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for
	/// example, if you specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To
	/// retrieve any other value from the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCW_ATOM -32</term>
	/// <term>
	/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClassEx function returns.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>Retrieves the size, in bytes, of the extra memory associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Retrieves the size, in bytes, of the extra window memory associated with each window in the class. For information on how to
	/// access this memory, see GetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_HBRBACKGROUND -10</term>
	/// <term>Retrieves a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Retrieves a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Retrieves a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Retrieves a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Retrieves the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Retrieves the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>
	/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
	/// CallWindowProc function to call the window procedure.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>If the function succeeds, the return value is the requested value.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </remarks>
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static IntPtr GetClassLong(HWND hWnd, GetClassLongFlag nIndex) => GetClassLong(hWnd, (int)nIndex);

	/// <summary>Retrieves the name of the class to which the specified window belongs.</summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="lpClassName">
	/// <para>Type: <c>LPTSTR</c></para>
	/// <para>The class name string.</para>
	/// </param>
	/// <param name="nMaxCount">
	/// <para>Type: <c>int</c></para>
	/// <para>The length</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>int</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the number of characters copied to the buffer, not including the terminating null character.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclassname int GetClassName( HWND hWnd, LPTSTR
	// lpClassName, int nMaxCount );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern int GetClassName(HWND hWnd, StringBuilder lpClassName, int nMaxCount);

	/// <summary>
	/// <para>
	/// Retrieves the 16-bit ( <c>WORD</c>) value at the specified offset into the extra class memory for the window class to which the
	/// specified window belongs.
	/// </para>
	/// <para>
	/// <c>Note</c> This function is deprecated for any use other than <c>nIndex</c> set to <c>GCW_ATOM</c>. The function is provided
	/// only for compatibility with 16-bit versions of Windows. Applications should use the GetClassLongPtr or GetClassLongPtr function.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The zero-based byte offset of the value to be retrieved. Valid values are in the range zero through the number of bytes of class
	/// memory, minus two; for example, if you specified 10 or more bytes of extra class memory, a value of eight would be an index to
	/// the fifth 16-bit integer. There is an additional valid value as shown in the following table.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term><c>GCW_ATOM</c> -32</term>
	/// <term>
	/// Retrieves an <c>ATOM</c> value that uniquely identifies the window class. This is the same atom that the RegisterClass or
	/// RegisterClassEx function returns.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>WORD</c></para>
	/// <para>If the function succeeds, the return value is the requested 16-bit value.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASS structure used with the
	/// RegisterClass function.
	/// </remarks>
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclassword
	// WORD GetClassWord( [in] HWND hWnd, [in] int nIndex );
	[PInvokeData("winuser.h", MSDNShortId = "NF:winuser.GetClassWord")]
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	public static extern ushort GetClassWord([In] HWND hWnd, GCW nIndex);

	/// <summary>
	/// Retrieves the coordinates of a window's client area. The client coordinates specify the upper-left and lower-right corners of the
	/// client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the
	/// upper-left corner are (0,0).
	/// </summary>
	/// <param name="hWnd">A handle to the window whose client coordinates are to be retrieved.</param>
	/// <param name="lpRect">
	/// A pointer to a RECT structure that receives the client coordinates. The left and top members are zero. The right and bottom
	/// members contain the width and height of the window.
	/// </param>
	/// <returns>
	/// If the function succeeds, the return value is true. If the function fails, the return value is false. To get extended error
	/// information, call GetLastError.
	/// </returns>
	[PInvokeData("WinUser.h", MSDNShortId = "ms633503")]
	[DllImport(Lib.User32, CharSet = CharSet.Auto, ExactSpelling = true, SetLastError = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	[System.Security.SecurityCritical]
	public static extern bool GetClientRect(HWND hWnd, out RECT lpRect);

	/// <summary>
	/// Retrieves a handle to the desktop window. The desktop window covers the entire screen. The desktop window is the area on top of
	/// which other windows are painted.
	/// </summary>
	/// <returns>The return value is a handle to the desktop window.</returns>
	// HWND WINAPI GetDesktopWindow(void); https://msdn.microsoft.com/en-us/library/windows/desktop/ms633504(v=vs.85).aspx
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("Winuser.h", MSDNShortId = "ms633504")]
	public static extern HWND GetDesktopWindow();

	/// <summary>
	/// Retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue.
	/// </summary>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// The return value is the handle to the window with the keyboard focus. If the calling thread's message queue does not have an
	/// associated window with the keyboard focus, the return value is <c>NULL</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// <c>GetFocus</c> returns the window with the keyboard focus for the current thread's message queue. If <c>GetFocus</c> returns
	/// <c>NULL</c>, another thread's queue may be attached to a window that has the keyboard focus.
	/// </para>
	/// <para>
	/// Use the GetForegroundWindow function to retrieve the handle to the window with which the user is currently working. You can
	/// associate your thread's message queue with the windows owned by another thread by using the AttachThreadInput function.
	/// </para>
	/// <para>
	/// To get the window with the keyboard focus on the foreground queue or the queue of another thread, use the GetGUIThreadInfo function.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see "Creating a Combo Box Toolbar" in Using Combo Boxes.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getfocus HWND GetFocus( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND GetFocus();

	/// <summary>
	/// <para>
	/// Retrieves a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly
	/// higher priority to the thread that creates the foreground window than it does to other threads.
	/// </para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// The return value is a handle to the foreground window. The foreground window can be <c>NULL</c> in certain circumstances, such as
	/// when a window is losing activation.
	/// </para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getforegroundwindow HWND GetForegroundWindow( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getforegroundwindow")]
	public static extern HWND GetForegroundWindow();

	/// <summary>
	/// <para>Retrieves information about the active window or a specified GUI thread.</para>
	/// </summary>
	/// <param name="idThread">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The identifier for the thread for which information is to be retrieved. To retrieve this value, use the GetWindowThreadProcessId
	/// function. If this parameter is <c>NULL</c>, the function returns information for the foreground thread.
	/// </para>
	/// </param>
	/// <param name="pgui">
	/// <para>Type: <c>LPGUITHREADINFO</c></para>
	/// <para>
	/// A pointer to a GUITHREADINFO structure that receives information describing the thread. Note that you must set the <c>cbSize</c>
	/// member to before calling this function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function succeeds even if the active window is not owned by the calling process. If the specified thread does not exist or
	/// have an input queue, the function will fail.
	/// </para>
	/// <para>
	/// This function is useful for retrieving out-of-context information about a thread. The information retrieved is the same as if an
	/// application retrieved the information about itself.
	/// </para>
	/// <para>
	/// For an edit control, the returned <c>rcCaret</c> rectangle contains the caret plus information on text direction and padding.
	/// Thus, it may not give the correct position of the cursor. The Sans Serif font uses four characters for the cursor:
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Cursor character</term>
	/// <term>Unicode code point</term>
	/// </listheader>
	/// <item>
	/// <term>CURSOR_LTR</term>
	/// <term>0xf00c</term>
	/// </item>
	/// <item>
	/// <term>CURSOR_RTL</term>
	/// <term>0xf00d</term>
	/// </item>
	/// <item>
	/// <term>CURSOR_THAI</term>
	/// <term>0xf00e</term>
	/// </item>
	/// <item>
	/// <term>CURSOR_USA</term>
	/// <term>0xfff (this is a marker value with no associated glyph)</term>
	/// </item>
	/// </list>
	/// <para>To get the actual insertion point in the <c>rcCaret</c> rectangle, perform the following steps.</para>
	/// <list type="number">
	/// <item>
	/// <term>Call GetKeyboardLayout to retrieve the current input language.</term>
	/// </item>
	/// <item>
	/// <term>Determine the character used for the cursor, based on the current input language.</term>
	/// </item>
	/// <item>
	/// <term>
	/// Call CreateFont using Sans Serif for the font, the height given by <c>rcCaret</c>, and a width of . For fnWeight, call . If
	/// pvParam is greater than 1, set fnWeight to 700, otherwise set fnWeight to 400.
	/// </term>
	/// </item>
	/// <item>
	/// <term>Select the font into a device context (DC) and use GetCharABCWidths to get the width of the appropriate cursor character.</term>
	/// </item>
	/// <item>
	/// <term>Add the width to <c>rcCaret</c>. <c>left</c> to obtain the actual insertion point.</term>
	/// </item>
	/// </list>
	/// <para>
	/// The function may not return valid window handles in the GUITHREADINFO structure when called to retrieve information for the
	/// foreground thread, such as when a window is losing activation.
	/// </para>
	/// <para>DPI Virtualization</para>
	/// <para>
	/// The coordinates returned in the <c>rcCaret</c> rect of the GUITHREADINFO struct are logical coordinates in terms of the window
	/// associated with the caret. They are not virtualized into the mode of the calling thread.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getguithreadinfo BOOL GetGUIThreadInfo( DWORD idThread,
	// PGUITHREADINFO pgui );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getguithreadinfo")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO pgui);

	/// <summary>
	/// <para>Determines which pop-up window owned by the specified window was most recently active.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the owner window.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// The return value identifies the most recently active pop-up window. The return value is the same as the hWnd parameter, if any of
	/// the following conditions are met:
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>The window identified by hWnd was most recently active.</term>
	/// </item>
	/// <item>
	/// <term>The window identified by hWnd does not own any pop-up windows.</term>
	/// </item>
	/// <item>
	/// <term>The window identifies by hWnd is not a top-level window, or it is owned by another window.</term>
	/// </item>
	/// </list>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getlastactivepopup HWND GetLastActivePopup( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getlastactivepopup")]
	public static extern HWND GetLastActivePopup(HWND hWnd);

	/// <summary>
	/// <para>Retrieves the opacity and transparency color key of a layered window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the layered window. A layered window is created by specifying <c>WS_EX_LAYERED</c> when creating the window with the
	/// CreateWindowEx function or by setting <c>WS_EX_LAYERED</c> using SetWindowLong after the window has been created.
	/// </para>
	/// </param>
	/// <param name="pcrKey">
	/// <para>Type: <c>COLORREF*</c></para>
	/// <para>
	/// A pointer to a COLORREF value that receives the transparency color key to be used when composing the layered window. All pixels
	/// painted by the window in this color will be transparent. This can be <c>NULL</c> if the argument is not needed.
	/// </para>
	/// </param>
	/// <param name="pbAlpha">
	/// <para>Type: <c>BYTE*</c></para>
	/// <para>
	/// The Alpha value used to describe the opacity of the layered window. Similar to the <c>SourceConstantAlpha</c> member of the
	/// BLENDFUNCTION structure. When the variable referred to by pbAlpha is 0, the window is completely transparent. When the variable
	/// referred to by pbAlpha is 255, the window is opaque. This can be <c>NULL</c> if the argument is not needed.
	/// </para>
	/// </param>
	/// <param name="pdwFlags">
	/// <para>Type: <c>DWORD*</c></para>
	/// <para>
	/// A layering flag. This parameter can be <c>NULL</c> if the value is not needed. The layering flag can be one or more of the
	/// following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>LWA_ALPHA 0x00000002</term>
	/// <term>Use pbAlpha to determine the opacity of the layered window.</term>
	/// </item>
	/// <item>
	/// <term>LWA_COLORKEY 0x00000001</term>
	/// <term>Use pcrKey as the transparency color.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// <c>GetLayeredWindowAttributes</c> can be called only if the application has previously called SetLayeredWindowAttributes on the
	/// window. The function will fail if the layered window was setup with UpdateLayeredWindow.
	/// </para>
	/// <para>For more information, see Using Layered Windows.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getlayeredwindowattributes BOOL
	// GetLayeredWindowAttributes( HWND hwnd, COLORREF *pcrKey, BYTE *pbAlpha, DWORD *pdwFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getlayeredwindowattributes")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetLayeredWindowAttributes(HWND hwnd, out COLORREF pcrKey, out byte pbAlpha, out LayeredWindowAttributes pdwFlags);

	/// <summary>
	/// <para>
	/// Retrieves a handle to the next or previous window in the Z-Order. The next window is below the specified window; the previous
	/// window is above.
	/// </para>
	/// <para>
	/// If the specified window is a topmost window, the function searches for a topmost window. If the specified window is a top-level
	/// window, the function searches for a top-level window. If the specified window is a child window, the function searches for a
	/// child window.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to a window. The window handle retrieved is relative to this window, based on the value of the wCmd parameter.</para>
	/// </param>
	/// <param name="wCmd">
	/// <para>Type: <c>UINT</c></para>
	/// <para>
	/// Indicates whether the function returns a handle to the next window or the previous window. This parameter can be either of the
	/// following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GW_HWNDNEXT 2</term>
	/// <term>Returns a handle to the window below the given window.</term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDPREV 3</term>
	/// <term>Returns a handle to the window above the given window.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>None</para>
	/// </returns>
	/// <remarks>
	/// <para>This function is implemented as a call to the GetWindow function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getnextwindow void GetNextWindow( hWnd, wCmd );
	[PInvokeData("winuser.h", MSDNShortId = "getnextwindow")]
	public static void GetNextWindow(HWND hWnd, GetWindowCmd wCmd) => GetWindow(hWnd, wCmd);

	/// <summary>
	/// <para>Retrieves a handle to the specified window's parent or owner.</para>
	/// <para>To retrieve a handle to a specified ancestor, use the GetAncestor function.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose parent window handle is to be retrieved.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window with the
	/// <c>WS_POPUP</c> style, the return value is a handle to the owner window.
	/// </para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// <para>This function typically fails for one of the following reasons:</para>
	/// <list type="bullet">
	/// <item>
	/// <term>The window is a top-level window that is unowned or does not have the <c>WS_POPUP</c> style.</term>
	/// </item>
	/// <item>
	/// <term>The owner window has <c>WS_POPUP</c> style.</term>
	/// </item>
	/// </list>
	/// </returns>
	/// <remarks>
	/// <para>
	/// To obtain a window's owner window, instead of using <c>GetParent</c>, use GetWindow with the <c>GW_OWNER</c> flag. To obtain the
	/// parent window and not the owner, instead of using <c>GetParent</c>, use GetAncestor with the <c>GA_PARENT</c> flag.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Initializing a Dialog Box.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getparent HWND GetParent( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getparent")]
	public static extern HWND GetParent(HWND hWnd);

	/// <summary>
	/// <para>Retrieves the default layout that is used when windows are created with no parent or owner.</para>
	/// </summary>
	/// <param name="pdwDefaultLayout">
	/// <para>Type: <c>DWORD*</c></para>
	/// <para>The current default process layout. For a list of values, see SetProcessDefaultLayout.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The layout specifies how text and graphics are laid out in a window; the default is left to right. The
	/// <c>GetProcessDefaultLayout</c> function lets you know if the default layout has changed, from using SetProcessDefaultLayout.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getprocessdefaultlayout BOOL GetProcessDefaultLayout(
	// DWORD *pdwDefaultLayout );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getprocessdefaultlayout")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetProcessDefaultLayout(out DefaultLayout pdwDefaultLayout);

	/// <summary>
	/// <para>Retrieves a handle to the Shell's desktop window.</para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>The return value is the handle of the Shell's desktop window. If no Shell process is present, the return value is <c>NULL</c>.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getshellwindow HWND GetShellWindow( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getshellwindow")]
	public static extern HWND GetShellWindow();

	/// <summary>
	/// <para>Retrieves information about the specified title bar.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the title bar whose information is to be retrieved.</para>
	/// </param>
	/// <param name="pti">
	/// <para>Type: <c>PTITLEBARINFO</c></para>
	/// <para>
	/// A pointer to a TITLEBARINFO structure to receive the information. Note that you must set the <c>cbSize</c> member to before
	/// calling this function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-gettitlebarinfo BOOL GetTitleBarInfo( HWND hwnd,
	// PTITLEBARINFO pti );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "gettitlebarinfo")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetTitleBarInfo(HWND hwnd, ref TITLEBARINFO pti);

	/// <summary>
	/// <para>
	/// Examines the Z order of the child windows associated with the specified parent window and retrieves a handle to the child window
	/// at the top of the Z order.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the parent window whose child windows are to be examined. If this parameter is <c>NULL</c>, the function returns a
	/// handle to the window at the top of the Z order.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is a handle to the child window at the top of the Z order. If the specified window has
	/// no child windows, the return value is <c>NULL</c>. To get extended error information, use the GetLastError function.
	/// </para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-gettopwindow HWND GetTopWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "gettopwindow")]
	public static extern HWND GetTopWindow([Optional] HWND hWnd);

	/// <summary>
	/// <para>Retrieves a handle to a window that has the specified relationship (Z-Order or owner) to the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to a window. The window handle retrieved is relative to this window, based on the value of the uCmd parameter.</para>
	/// </param>
	/// <param name="uCmd">
	/// <para>Type: <c>UINT</c></para>
	/// <para>
	/// The relationship between the specified window and the window whose handle is to be retrieved. This parameter can be one of the
	/// following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GW_CHILD 5</term>
	/// <term>
	/// The retrieved handle identifies the child window at the top of the Z order, if the specified window is a parent window;
	/// otherwise, the retrieved handle is NULL. The function examines only child windows of the specified window. It does not examine
	/// descendant windows.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_ENABLEDPOPUP 6</term>
	/// <term>
	/// The retrieved handle identifies the enabled popup window owned by the specified window (the search uses the first such window
	/// found using GW_HWNDNEXT); otherwise, if there are no enabled popup windows, the retrieved handle is that of the specified window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDFIRST 0</term>
	/// <term>
	/// The retrieved handle identifies the window of the same type that is highest in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDLAST 1</term>
	/// <term>
	/// The retrieved handle identifies the window of the same type that is lowest in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDNEXT 2</term>
	/// <term>
	/// The retrieved handle identifies the window below the specified window in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDPREV 3</term>
	/// <term>
	/// The retrieved handle identifies the window above the specified window in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_OWNER 4</term>
	/// <term>The retrieved handle identifies the specified window's owner window, if any. For more information, see Owned Windows.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is a window handle. If no window exists with the specified relationship to the
	/// specified window, the return value is <c>NULL</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The EnumChildWindows function is more reliable than calling <c>GetWindow</c> in a loop. An application that calls
	/// <c>GetWindow</c> to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindow HWND GetWindow( HWND hWnd, UINT uCmd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindow")]
	public static extern HWND GetWindow(HWND hWnd, GetWindowCmd uCmd);

	/// <summary>Retrieves a handle to a window that has the specified relationship (Z-Order or owner) to the specified window.</summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to a window. The window handle retrieved is relative to this window, based on the value of the uCmd parameter.</para>
	/// </param>
	/// <param name="uCmd">
	/// <para>Type: <c>UINT</c></para>
	/// <para>
	/// The relationship between the specified window and the window whose handle is to be retrieved. This parameter can be one of the
	/// following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GW_CHILD 5</term>
	/// <term>
	/// The retrieved handle identifies the child window at the top of the Z order, if the specified window is a parent window;
	/// otherwise, the retrieved handle is NULL. The function examines only child windows of the specified window. It does not examine
	/// descendant windows.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_ENABLEDPOPUP 6</term>
	/// <term>
	/// The retrieved handle identifies the enabled popup window owned by the specified window (the search uses the first such window
	/// found using GW_HWNDNEXT); otherwise, if there are no enabled popup windows, the retrieved handle is that of the specified window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDFIRST 0</term>
	/// <term>
	/// The retrieved handle identifies the window of the same type that is highest in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDLAST 1</term>
	/// <term>
	/// The retrieved handle identifies the window of the same type that is lowest in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDNEXT 2</term>
	/// <term>
	/// The retrieved handle identifies the window below the specified window in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_HWNDPREV 3</term>
	/// <term>
	/// The retrieved handle identifies the window above the specified window in the Z order. If the specified window is a topmost
	/// window, the handle identifies a topmost window. If the specified window is a top-level window, the handle identifies a top-level
	/// window. If the specified window is a child window, the handle identifies a sibling window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GW_OWNER 4</term>
	/// <term>The retrieved handle identifies the specified window's owner window, if any. For more information, see Owned Windows.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is a window handle. If no window exists with the specified relationship to the
	/// specified window, the return value is <c>NULL</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// The EnumChildWindows function is more reliable than calling <c>GetWindow</c> in a loop. An application that calls
	/// <c>GetWindow</c> to perform this task risks being caught in an infinite loop or referencing a handle to a window that has been destroyed.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindow HWND GetWindow( HWND hWnd, UINT uCmd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND GetWindow(HWND hWnd, uint uCmd);

	/// <summary>Retrieves the Help context identifier, if any, associated with the specified window.</summary>
	/// <param name="Arg1">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window for which the Help context identifier is to be retrieved.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>DWORD</c></para>
	/// <para>Returns the Help context identifier if the window has one, or zero otherwise.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowcontexthelpid DWORD GetWindowContextHelpId( HWND
	// Arg1 );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "28e57c01-0327-4f64-9ef4-ca13c3c32b0c")]
	public static extern uint GetWindowContextHelpId(HWND Arg1);

	/// <summary>
	/// <para>Retrieves the current display affinity setting, from any process, for a given window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="pdwAffinity">
	/// <para>Type: <c>DWORD*</c></para>
	/// <para>The display affinity setting.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// This function succeeds only when the window is layered and Desktop Windows Manager is composing the desktop. If this function
	/// succeeds, it returns <c>TRUE</c>; otherwise, it returns <c>FALSE</c>. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function currently only supports one flag, <c>WDA_MONITOR</c> (0x01). This flag enables a window's contents to be displayed
	/// only on the monitor.
	/// </para>
	/// <para>
	/// This function and SetWindowDisplayAffinity are designed to support the window content protection feature unique to Windows 7.
	/// This feature enables applications to protect their own onscreen window content from being captured or copied via a specific set
	/// of public operating system features and APIs. However, it works only when the Desktop Window Manager (DWM) is composing the desktop.
	/// </para>
	/// <para>
	/// It is important to note that unlike a security feature or an implementation of Digital Rights Management (DRM), there is no
	/// guarantee that using SetWindowDisplayAffinity and <c>GetWindowDisplayAffinity</c>, and other necessary functions such as
	/// DwmIsCompositionEnabled, will strictly protect windowed content, as in the case where someone takes a photograph of the screen.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowdisplayaffinity BOOL GetWindowDisplayAffinity(
	// HWND hWnd, DWORD *pdwAffinity );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowdisplayaffinity")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetWindowDisplayAffinity(HWND hWnd, out WindowDisplayAffinity pdwAffinity);

	/// <summary>Retrieves the feedback configuration for a window.</summary>
	/// <param name="hwnd">The window to check for feedback configuration.</param>
	/// <param name="feedback">One of the values from the FEEDBACK_TYPE enumeration.</param>
	/// <param name="dwFlags">
	/// Specify GWFS_INCLUDE_ANCESTORS to check the parent window chain until a value is found. The default is 0 and indicates that only
	/// the specified window will be checked.
	/// </param>
	/// <param name="pSize">
	/// <para>The size of memory region that the config parameter points to.</para>
	/// <para>The pSize parameter specifies the size of the configuration data for the feedback type in feedback and must be sizeof(BOOL).</para>
	/// </param>
	/// <param name="config">
	/// <para>The configuration data.</para>
	/// <para>The config parameter must point to a value of type BOOL.</para>
	/// </param>
	/// <returns>
	/// Returns TRUE if the specified feedback setting is configured on the specified window. Otherwise, it returns FALSE (and config
	/// won't be modified).
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowfeedbacksetting BOOL GetWindowFeedbackSetting(
	// HWND hwnd, FEEDBACK_TYPE feedback, DWORD dwFlags, UINT32 *pSize, VOID *config );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "a40806b3-9085-42b6-9a87-95be0d1669c6")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetWindowFeedbackSetting(HWND hwnd, FEEDBACK_TYPE feedback, GWFS dwFlags, ref uint pSize, [MarshalAs(UnmanagedType.Bool)] out bool config);

	/// <summary>
	/// <para>Retrieves information about the specified window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose information is to be retrieved.</para>
	/// </param>
	/// <param name="pwi">
	/// <para>Type: <c>PWINDOWINFO</c></para>
	/// <para>
	/// A pointer to a WINDOWINFO structure to receive the information. Note that you must set the <c>cbSize</c> member to before calling
	/// this function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero.</para>
	/// <para>To get extended error information, call GetLastError.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowinfo BOOL GetWindowInfo( HWND hwnd, PWINDOWINFO
	// pwi );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowinfo")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetWindowInfo(HWND hwnd, ref WINDOWINFO pwi);

	/// <summary>
	/// <para>Retrieves the full path and file name of the module associated with the specified window handle.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose module file name is to be retrieved.</para>
	/// </param>
	/// <param name="pszFileName">
	/// <para>Type: <c>LPTSTR</c></para>
	/// <para>The path and file name.</para>
	/// </param>
	/// <param name="cchFileNameMax">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The maximum number of characters that can be copied into the lpszFileName buffer.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>UINT</c></c></para>
	/// <para>The return value is the total number of characters copied into the buffer.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowmodulefilenamea UINT GetWindowModuleFileNameA(
	// HWND hwnd, LPSTR pszFileName, UINT cchFileNameMax );
	[DllImport(Lib.User32, SetLastError = false, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowmodulefilename")]
	public static extern uint GetWindowModuleFileName(HWND hwnd, StringBuilder pszFileName, uint cchFileNameMax);

	/// <summary>
	/// <para>Retrieves the show state and the restored, minimized, and maximized positions of the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="lpwndpl">
	/// <para>Type: <c>WINDOWPLACEMENT*</c></para>
	/// <para>
	/// A pointer to the WINDOWPLACEMENT structure that receives the show state and position information. Before calling
	/// <c>GetWindowPlacement</c>, set the <c>length</c> member to . <c>GetWindowPlacement</c> fails if lpwndpl-&gt; length is not set correctly.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>flags</c> member of WINDOWPLACEMENT retrieved by this function is always zero. If the window identified by the hWnd
	/// parameter is maximized, the <c>showCmd</c> member is SW_SHOWMAXIMIZED. If the window is minimized, <c>showCmd</c> is
	/// SW_SHOWMINIMIZED. Otherwise, it is SW_SHOWNORMAL.
	/// </para>
	/// <para>
	/// The <c>length</c> member of WINDOWPLACEMENT must be set to sizeof( <c>WINDOWPLACEMENT</c>). If this member is not set correctly,
	/// the function returns <c>FALSE</c>. For additional remarks on the proper use of window placement coordinates, see <c>WINDOWPLACEMENT</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowplacement BOOL GetWindowPlacement( HWND hWnd,
	// WINDOWPLACEMENT *lpwndpl );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowplacement")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool GetWindowPlacement(HWND hWnd, ref WINDOWPLACEMENT lpwndpl);

	/// <summary>
	/// Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that
	/// are relative to the upper-left corner of the screen.
	/// </summary>
	/// <param name="hWnd">A handle to the window.</param>
	/// <param name="lpRect">
	/// A pointer to a RECT structure that receives the screen coordinates of the upper-left and lower-right corners of the window.
	/// </param>
	/// <returns>
	/// If the function succeeds, the return value is true. If the function fails, the return value is false. To get extended error
	/// information, call GetLastError.
	/// </returns>
	[PInvokeData("WinUser.h", MSDNShortId = "ms633519")]
	[DllImport(Lib.User32, ExactSpelling = true, SetLastError = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	[System.Security.SecurityCritical]
	public static extern bool GetWindowRect(HWND hWnd, out RECT lpRect);

	/// <summary>
	/// <para>
	/// Copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text
	/// of the control is copied. However, <c>GetWindowText</c> cannot retrieve the text of a control in another application.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window or control containing the text.</para>
	/// </param>
	/// <param name="lpString">
	/// <para>Type: <c>LPTSTR</c></para>
	/// <para>
	/// The buffer that will receive the text. If the string is as long or longer than the buffer, the string is truncated and terminated
	/// with a null character.
	/// </para>
	/// </param>
	/// <param name="nMaxCount">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The maximum number of characters to copy to the buffer, including the null character. If the text exceeds this limit, it is truncated.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>int</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null
	/// character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the
	/// return value is zero. To get extended error information, call GetLastError.
	/// </para>
	/// <para>This function cannot retrieve the text of an edit control in another application.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the target window is owned by the current process, <c>GetWindowText</c> causes a WM_GETTEXT message to be sent to the
	/// specified window or control. If the target window is owned by another process and has a caption, <c>GetWindowText</c> retrieves
	/// the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It
	/// allows applications to call <c>GetWindowText</c> without becoming unresponsive if the process that owns the target window is not
	/// responding. However, if the target window is not responding and it belongs to the calling application, <c>GetWindowText</c> will
	/// cause the calling application to become unresponsive.
	/// </para>
	/// <para>To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling <c>GetWindowText</c>.</para>
	/// <para>Examples</para>
	/// <para>For an example, see Sending a Message.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtexta int GetWindowTextA( HWND hWnd, LPSTR
	// lpString, int nMaxCount );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowtext")]
	public static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount);

	/// <summary>
	/// <para>
	/// Retrieves the length, in characters, of the specified window's title bar text (if the window has a title bar). If the specified
	/// window is a control, the function retrieves the length of the text within the control. However, <c>GetWindowTextLength</c> cannot
	/// retrieve the length of the text of an edit control in another application.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window or control.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>int</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the length, in characters, of the text. Under certain conditions, this value may
	/// actually be greater than the length of the text. For more information, see the following Remarks section.
	/// </para>
	/// <para>If the window has no text, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the target window is owned by the current process, <c>GetWindowTextLength</c> causes a WM_GETTEXTLENGTH message to be sent to
	/// the specified window or control.
	/// </para>
	/// <para>
	/// Under certain conditions, the <c>GetWindowTextLength</c> function may return a value that is larger than the actual length of the
	/// text. This occurs with certain mixtures of ANSI and Unicode, and is due to the system allowing for the possible existence of
	/// double-byte character set (DBCS) characters within the text. The return value, however, will always be at least as large as the
	/// actual length of the text; you can thus always use it to guide buffer allocation. This behavior can occur when an application
	/// uses both ANSI functions and common dialogs, which use Unicode. It can also occur when an application uses the ANSI version of
	/// <c>GetWindowTextLength</c> with a window whose window procedure is Unicode, or the Unicode version of <c>GetWindowTextLength</c>
	/// with a window whose window procedure is ANSI. For more information on ANSI and ANSI functions, see Conventions for Function Prototypes.
	/// </para>
	/// <para>
	/// To obtain the exact length of the text, use the WM_GETTEXT, LB_GETTEXT, or CB_GETLBTEXT messages, or the GetWindowText function.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowtextlengtha int GetWindowTextLengthA( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowtextlength")]
	public static extern int GetWindowTextLength(HWND hWnd);

	/// <summary>
	/// <para>
	/// Retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that
	/// created the window.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="lpdwProcessId">
	/// <para>Type: <c>LPDWORD</c></para>
	/// <para>
	/// A pointer to a variable that receives the process identifier. If this parameter is not <c>NULL</c>,
	/// <c>GetWindowThreadProcessId</c> copies the identifier of the process to the variable; otherwise, it does not.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>DWORD</c></c></para>
	/// <para>The return value is the identifier of the thread that created the window.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowthreadprocessid DWORD GetWindowThreadProcessId(
	// HWND hWnd, LPDWORD lpdwProcessId );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "getwindowthreadprocessid")]
	public static extern uint GetWindowThreadProcessId(HWND hWnd, out uint lpdwProcessId);

	/// <summary>
	/// Enables a Dynamic Data Exchange (DDE) server application to impersonate a DDE client application's security context. This
	/// protects secure server data from unauthorized DDE clients.
	/// </summary>
	/// <param name="hWndClient">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the DDE client window to be impersonated. The client window must have established a DDE conversation with the server
	/// window identified by the hWndServer parameter.
	/// </para>
	/// </param>
	/// <param name="hWndServer">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the DDE server window. An application must create the server window before calling this function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// An application should call the RevertToSelf function to undo the impersonation set by the <c>ImpersonateDdeClientWindow</c> function.
	/// </para>
	/// <para>A DDEML application should use the DdeImpersonateClient function.</para>
	/// <para>Security Considerations</para>
	/// <para>
	/// Using this function incorrectly might compromise the security of your program. It is very important to check the return value of
	/// the call. If the function fails for any reason, the client is not impersonated and any subsequent client request is made in the
	/// security context of the calling process. If the calling process is running as a highly privileged account, such as LocalSystem or
	/// as a member of an administrative group, the user may be able to perform actions that would otherwise be disallowed. Therefore, if
	/// the call fails or raises an error do not continue execution of the client request.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/dde/nf-dde-impersonateddeclientwindow BOOL ImpersonateDdeClientWindow( HWND
	// hWndClient, HWND hWndServer );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("dde.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ImpersonateDdeClientWindow(HWND hWndClient, HWND hWndServer);

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>Copies the text of the specified window's title bar (if it has one) into a buffer.</para>
	/// <para>
	/// This function is similar to the GetWindowText function. However, it obtains the window text directly from the window structure
	/// associated with the specified window's handle and then always provides the text as a Unicode string. This is unlike
	/// <c>GetWindowText</c> which obtains the text by sending the window a WM_GETTEXT message. If the specified window is a control, the
	/// text of the control is obtained.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window or control containing the text.</para>
	/// </param>
	/// <param name="pString">
	/// <para>Type: <c>LPWSTR</c></para>
	/// <para>The buffer that is to receive the text.</para>
	/// <para>If the string is as long or longer than the buffer, the string is truncated and terminated with a null character.</para>
	/// </param>
	/// <param name="cchMaxCount">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The maximum number of characters to be copied to the buffer, including the null character. If the text exceeds this limit, it is truncated.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>int</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating null
	/// character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the
	/// return value is zero. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server
	/// 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-internalgetwindowtext int InternalGetWindowText( HWND
	// hWnd, LPWSTR pString, int cchMaxCount );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "internalgetwindowtext")]
	public static extern int InternalGetWindowText(HWND hWnd, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder pString, int cchMaxCount);

	/// <summary>
	/// <para>
	/// Determines whether a window is a child window or descendant window of a specified parent window. A child window is the direct
	/// descendant of a specified parent window if that parent window is in the chain of parent windows; the chain of parent windows
	/// leads from the original overlapped or pop-up window to the child window.
	/// </para>
	/// </summary>
	/// <param name="hWndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window.</para>
	/// </param>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window is a child or descendant window of the specified parent window, the return value is nonzero.</para>
	/// <para>If the window is not a child or descendant window of the specified parent window, the return value is zero.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-ischild BOOL IsChild( HWND hWndParent, HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "ischild")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsChild(HWND hWndParent, HWND hWnd);

	/// <summary>
	/// <para>Determines whether the calling thread is already a GUI thread. It can also optionally convert the thread to a GUI thread.</para>
	/// </summary>
	/// <param name="bConvert">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If <c>TRUE</c> and the thread is not a GUI thread, convert the thread to a GUI thread.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>The function returns a nonzero value in the following situations:</para>
	/// <list type="bullet">
	/// <item>
	/// <term>If the calling thread is already a GUI thread.</term>
	/// </item>
	/// <item>
	/// <term>If bConvert is <c>TRUE</c> and the function successfully converts the thread to a GUI thread.</term>
	/// </item>
	/// </list>
	/// <para>Otherwise, the function returns zero.</para>
	/// <para>
	/// If bConvert is <c>TRUE</c> and the function cannot successfully convert the thread to a GUI thread, <c>IsGUIThread</c> returns <c>ERROR_NOT_ENOUGH_MEMORY</c>.
	/// </para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-isguithread BOOL IsGUIThread( BOOL bConvert );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "isguithread")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsGUIThread([MarshalAs(UnmanagedType.Bool)] bool bConvert);

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>
	/// Determines whether the system considers that a specified application is not responding. An application is considered to be not
	/// responding if it is not waiting for input, is not in startup processing, and has not called PeekMessage within the internal
	/// timeout period of 5 seconds.
	/// </para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// The return value is <c>TRUE</c> if the window stops responding; otherwise, it is <c>FALSE</c>. Ghost windows always return <c>TRUE</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>The Windows timeout criteria of 5 seconds is subject to change.</para>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP Service Pack 1 (SP1) and Windows Server 2003. If
	/// you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-ishungappwindow BOOL IsHungAppWindow( HWND hwnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "ishungappwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsHungAppWindow(HWND hwnd);

	/// <summary>
	/// <para>Determines whether the specified window is minimized (iconic).</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window is iconic, the return value is nonzero.</para>
	/// <para>If the window is not iconic, the return value is zero.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-isiconic BOOL IsIconic( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "isiconic")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsIconic(HWND hWnd);

	/// <summary>
	/// <para>[</para>
	/// <para>
	/// IsProcessDPIAware is available for use in the operating systems specified in the Requirements section. It may be altered or
	/// unavailable in subsequent versions. Instead, use GetProcessDPIAwareness.
	/// </para>
	/// <para>]</para>
	/// <para>
	/// Determines whether the current process is dots per inch (dpi) aware such that it adjusts the sizes of UI elements to compensate
	/// for the dpi setting.
	/// </para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para><c>TRUE</c> if the process is dpi aware; otherwise, <c>FALSE</c>.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-isprocessdpiaware BOOL IsProcessDPIAware( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "isprocessdpiaware")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsProcessDPIAware();

	/// <summary>
	/// <para>Determines whether the specified window handle identifies an existing window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window handle identifies an existing window, the return value is nonzero.</para>
	/// <para>If the window handle does not identify an existing window, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// A thread should not use <c>IsWindow</c> for a window that it did not create because the window could be destroyed after this
	/// function was called. Further, because window handles are recycled the handle could even point to a different window.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Creating a Modeless Dialog Box.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-iswindow BOOL IsWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "iswindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsWindow(HWND hWnd);

	/// <summary>Determines whether the specified window is enabled for mouse and keyboard input.</summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If the window is enabled, the return value is nonzero.</para>
	/// <para>If the window is not enabled, the return value is zero.</para>
	/// </returns>
	/// <remarks>A child window receives input only if it is both enabled and visible.</remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-iswindowenabled BOOL IsWindowEnabled( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsWindowEnabled(HWND hWnd);

	/// <summary>
	/// The <c>IsWindowRedirectedForPrint</c> function determines whether the specified window is currently redirected for printing.
	/// </summary>
	/// <param name="hWnd">The h WND.</param>
	/// <returns>
	/// If the window is currently redirected for printing, the function returns a nonzero value; otherwise, it returns zero.
	/// </returns>
	/// <remarks>
	/// <para>
	/// A window is redirected for printing when it processes a call to <c>PrintWindow</c>. In a call to <c>PrintWindow</c>, a window
	/// renders its content to an off-screen device context.
	/// </para>
	/// <para>
	/// This function has no associated import library or header file; you must call it by using the <c>LoadLibrary</c> and
	/// <c>GetProcAddress</c> functions.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/printdocs/iswindowredirectedforprint BOOL WINAPI IsWindowRedirectedForPrint( _In_
	// HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("", MSDNShortId = "49FD0D63-0F7F-48C6-81B6-25715294E7B7")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsWindowRedirectedForPrint([In] HWND hWnd);

	/// <summary>
	/// <para>Determines whether the specified window is a native Unicode window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window is a native Unicode window, the return value is nonzero.</para>
	/// <para>If the window is not a native Unicode window, the return value is zero. The window is a native ANSI window.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The character set of a window is determined by the use of the RegisterClass function. If the window class was registered with the
	/// ANSI version of <c>RegisterClass</c> ( <c>RegisterClassA</c>), the character set of the window is ANSI. If the window class was
	/// registered with the Unicode version of <c>RegisterClass</c> ( <c>RegisterClassW</c>), the character set of the window is Unicode.
	/// </para>
	/// <para>
	/// The system does automatic two-way translation (Unicode to ANSI) for window messages. For example, if an ANSI window message is
	/// sent to a window that uses the Unicode character set, the system translates that message into a Unicode message before calling
	/// the window procedure. The system calls <c>IsWindowUnicode</c> to determine whether to translate the message.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-iswindowunicode BOOL IsWindowUnicode( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "iswindowunicode")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsWindowUnicode(HWND hWnd);

	/// <summary>
	/// <para>Determines the visibility state of the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// If the specified window, its parent window, its parent's parent window, and so forth, have the <c>WS_VISIBLE</c> style, the
	/// return value is nonzero. Otherwise, the return value is zero.
	/// </para>
	/// <para>
	/// Because the return value specifies whether the window has the <c>WS_VISIBLE</c> style, it may be nonzero even if the window is
	/// totally obscured by other windows.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The visibility state of a window is indicated by the <c>WS_VISIBLE</c> style bit. When <c>WS_VISIBLE</c> is set, the window is
	/// displayed and subsequent drawing into it is displayed as long as the window has the <c>WS_VISIBLE</c> style.
	/// </para>
	/// <para>
	/// Any drawing to a window with the <c>WS_VISIBLE</c> style will not be displayed if the window is obscured by other windows or is
	/// clipped by its parent window.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-iswindowvisible BOOL IsWindowVisible( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "iswindowvisible")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsWindowVisible(HWND hWnd);

	/// <summary>
	/// <para>Determines whether a window is maximized.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be tested.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window is zoomed, the return value is nonzero.</para>
	/// <para>If the window is not zoomed, the return value is zero.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-iszoomed BOOL IsZoomed( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "iszoomed")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool IsZoomed(HWND hWnd);

	/// <summary>
	/// The foreground process can call the <c>LockSetForegroundWindow</c> function to disable calls to the SetForegroundWindow function.
	/// </summary>
	/// <param name="uLockCode">
	/// <para>Type: <c>UINT</c></para>
	/// <para>Specifies whether to enable or disable calls to SetForegroundWindow. This parameter can be one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>LSFW_LOCK 1</term>
	/// <term>Disables calls to SetForegroundWindow.</term>
	/// </item>
	/// <item>
	/// <term>LSFW_UNLOCK 2</term>
	/// <term>Enables calls to SetForegroundWindow.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The system automatically enables calls to SetForegroundWindow if the user presses the ALT key or takes some action that causes
	/// the system itself to change the foreground window (for example, clicking a background window).
	/// </para>
	/// <para>
	/// This function is provided so applications can prevent other applications from making a foreground change that can interrupt its
	/// interaction with the user.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-locksetforegroundwindow
	// BOOL LockSetForegroundWindow( UINT uLockCode );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool LockSetForegroundWindow(LSFW uLockCode);

	/// <summary>
	/// <para>Converts the logical coordinates of a point in a window to physical coordinates.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window whose transform is used for the conversion. Top level windows are fully supported. In the case of child
	/// windows, only the area of overlap between the parent and the child window is converted.
	/// </para>
	/// </param>
	/// <param name="lpPoint">
	/// <para>Type: <c>LPPOINT</c></para>
	/// <para>
	/// A pointer to a POINT structure that specifies the logical coordinates to be converted. The new physical coordinates are copied
	/// into this structure if the function succeeds.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>None</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Windows Vista introduces the concept of physical coordinates. Desktop Window Manager (DWM) scales non-dots per inch (dpi) aware
	/// windows when the display is high dpi. The window seen on the screen corresponds to the physical coordinates. The application
	/// continues to work in logical space. Therefore, the application's view of the window is different from that which appears on the
	/// screen. For scaled windows, logical and physical coordinates are different.
	/// </para>
	/// <para>
	/// <c>LogicalToPhysicalPoint</c> is a transformation API that can be called by a process that declares itself as dpi aware. The
	/// function uses the window identified by the hWnd parameter and the logical coordinates given in the POINT structure to compute the
	/// physical coordinates.
	/// </para>
	/// <para>
	/// The <c>LogicalToPhysicalPoint</c> function replaces the logical coordinates in the POINT structure with the physical coordinates.
	/// The physical coordinates are relative to the upper-left corner of the screen. The coordinates have to be inside the client area
	/// of hWnd.
	/// </para>
	/// <para>
	/// On all platforms, <c>LogicalToPhysicalPoint</c> will fail on a window that has either 0 width or height; an application must
	/// first establish a non-0 width and height by calling, for example, MoveWindow. On some versions of Windows (including Windows 7),
	/// <c>LogicalToPhysicalPoint</c> will still fail if <c>MoveWindow</c> has been called after a call to ShowWindow with <c>SH_HIDE</c>
	/// has hidden the window.
	/// </para>
	/// <para>
	/// In Windows 8, system–DPI aware applications translate between physical and logical space using PhysicalToLogicalPoint and
	/// LogicalToPhysicalPoint. In Windows 8.1, the additional virtualization of the system and inter-process communications means that
	/// for the majority of applications, you do not need these APIs. As a result, in Windows 8.1, PhysicalToLogicalPoint and
	/// LogicalToPhysicalPoint no longer transform points. The system returns all points to an application in its own coordinate space.
	/// This behavior preserves functionality for the majority of applications, but there are some exceptions in which you must make
	/// changes to ensure that the application works as expected. In those cases, use PhysicalToLogicalPointForPerMonitorDPI and LogicalToPhysicalPointForPerMonitorDPI.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-logicaltophysicalpoint BOOL LogicalToPhysicalPoint( HWND
	// hWnd, LPPOINT lpPoint );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "logicaltophysicalpoint")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool LogicalToPhysicalPoint(HWND hWnd, ref POINT lpPoint);

	/// <summary>
	/// <para>
	/// Changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to
	/// the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="X">
	/// <para>Type: <c>int</c></para>
	/// <para>The new position of the left side of the window.</para>
	/// </param>
	/// <param name="Y">
	/// <para>Type: <c>int</c></para>
	/// <para>The new position of the top of the window.</para>
	/// </param>
	/// <param name="nWidth">
	/// <para>Type: <c>int</c></para>
	/// <para>The new width of the window.</para>
	/// </param>
	/// <param name="nHeight">
	/// <para>Type: <c>int</c></para>
	/// <para>The new height of the window.</para>
	/// </param>
	/// <param name="bRepaint">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>
	/// Indicates whether the window is to be repainted. If this parameter is <c>TRUE</c>, the window receives a message. If the
	/// parameter is <c>FALSE</c>, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the
	/// title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the bRepaint parameter is <c>TRUE</c>, the system sends the WM_PAINT message to the window procedure immediately after moving
	/// the window (that is, the <c>MoveWindow</c> function calls the UpdateWindow function). If bRepaint is <c>FALSE</c>, the
	/// application must explicitly invalidate or redraw any parts of the window and parent window that need redrawing.
	/// </para>
	/// <para>
	/// <c>MoveWindow</c> sends the WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Creating, Enumerating, and Sizing Child Windows.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-movewindow BOOL MoveWindow( HWND hWnd, int X, int Y, int
	// nWidth, int nHeight, BOOL bRepaint );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "movewindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, [MarshalAs(UnmanagedType.Bool)] bool bRepaint);

	/// <summary>
	/// Signals the system that a predefined event occurred. If any client applications have registered a hook function for the event,
	/// the system calls the client's hook function.
	/// </summary>
	/// <param name="winEvent">The win event.</param>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>Handle to the window that contains the object that generated the event.</para>
	/// </param>
	/// <param name="idObject">
	/// <para>Type: <c>LONG</c></para>
	/// <para>
	/// Identifies the object that generated the event. This value is either one of the predefined object identifiers or a custom object
	/// ID value.
	/// </para>
	/// </param>
	/// <param name="idChild">
	/// <para>Type: <c>LONG</c></para>
	/// <para>
	/// Identifies whether the event was generated by an object or by a child element of the object. If this value is CHILDID_SELF, the
	/// event was generated by the object itself. If not CHILDID_SELF, this value is the child ID of the element that generated the event.
	/// </para>
	/// </param>
	/// <remarks>
	/// <para>
	/// Servers call this function to notify the system that an event has occurred. Microsoft Active Accessibility checks to see if any
	/// client applications have set hook procedures for the event and, if so, calls the appropriate hook procedures.
	/// </para>
	/// <para>If no hook procedures are registered for the event, the performance penalty for calling this function is minor.</para>
	/// <para>
	/// Servers call <c>NotifyWinEvent</c> to announce the event to the system after the event has occurred; they must never notify the
	/// system of an event before the event has occurred.
	/// </para>
	/// <para>
	/// When the client's hook procedure is called, it receives a number of parameters that describe the event and the object that
	/// generated the event. The hook procedure uses the AccessibleObjectFromEvent function to retrieve a pointer to the IAccessible
	/// interface of the object that generated the event.
	/// </para>
	/// <para>
	/// Servers may receive a WM_GETOBJECT message immediately after calling this function. This can happen if there are any in-context
	/// clients that call AccessibleObjectFromEvent in the event callback.
	/// </para>
	/// <para>
	/// When servers call this function, they must be ready to handle WM_GETOBJECT, return an IAccessible interface pointer, and handle
	/// any of the <c>IAccessible</c> methods.
	/// </para>
	/// <para>
	/// <c>Note to Server Developers:</c> When you call <c>NotifyWinEvent</c>, if any clients are listening for that event in-context,
	/// their event handlers, which typically send WM_GETOBJECT and call IAccessible methods, will execute before <c>NotifyWinEvent</c>
	/// returns. When you call <c>NotifyWinEvent</c>, you should be prepared to handle these calls, if they occur. If you need to do
	/// extra setup to allow for this, you should do so before you call <c>NotifyWinEvent</c>, not after.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-notifywinevent void NotifyWinEvent( DWORD event, HWND
	// hwnd, LONG idObject, LONG idChild );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "08e74d45-95b6-44c2-a2e0-5ba6ffdcd56a")]
	public static extern void NotifyWinEvent(uint winEvent, HWND hwnd, int idObject, int idChild);

	/// <summary>
	/// <para>Restores a minimized (iconic) window to its previous size and position; it then activates the window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to be restored and activated.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para><c>OpenIcon</c> sends a WM_QUERYOPEN message to the given window.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-openicon BOOL OpenIcon( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "openicon")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool OpenIcon(HWND hWnd);

	/// <summary>
	/// <para>Converts the physical coordinates of a point in a window to logical coordinates.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window whose transform is used for the conversion. Top level windows are fully supported. In the case of child
	/// windows, only the area of overlap between the parent and the child window is converted.
	/// </para>
	/// </param>
	/// <param name="lpPoint">
	/// <para>Type: <c>LPPOINT</c></para>
	/// <para>
	/// A pointer to a POINT structure that specifies the physical/screen coordinates to be converted. The new logical coordinates are
	/// copied into this structure if the function succeeds.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>None</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Windows Vista introduces the concept of physical coordinates. Desktop Window Manager (DWM) scales non-dots per inch (dpi) aware
	/// windows when the display is high dpi. The window seen on the screen corresponds to the physical coordinates. The application
	/// continues to work in logical space. Therefore, the application's view of the window is different from that which appears on the
	/// screen. For scaled windows, logical and physical coordinates are different.
	/// </para>
	/// <para>
	/// The function uses the window identified by the hWnd parameter and the physical coordinates given in the POINT structure to
	/// compute the logical coordinates. The logical coordinates are the unscaled coordinates that appear to the application in a
	/// programmatic way. In other words, the logical coordinates are the coordinates the application recognizes, which can be different
	/// from the physical coordinates. The API then replaces the physical coordinates with the logical coordinates. The new coordinates
	/// are in the world coordinates whose origin is (0, 0) on the desktop. The coordinates passed to the API have to be on the hWnd.
	/// </para>
	/// <para>The source coordinates are in device units.</para>
	/// <para>
	/// On all platforms, <c>PhysicalToLogicalPoint</c> will fail on a window that has either 0 width or height; an application must
	/// first establish a non-0 width and height by calling, for example, MoveWindow. On some versions of Windows (including Windows 7),
	/// <c>PhysicalToLogicalPoint</c> will still fail if <c>MoveWindow</c> has been called after a call to ShowWindow with <c>SH_HIDE</c>
	/// has hidden the window.
	/// </para>
	/// <para>
	/// In Windows 8, system–DPI aware applications translate between physical and logical space using PhysicalToLogicalPoint and
	/// LogicalToPhysicalPoint. In Windows 8.1, the additional virtualization of the system and inter-process communications means that
	/// for the majority of applications, you do not need these APIs. As a result, in Windows 8.1, PhysicalToLogicalPoint and
	/// LogicalToPhysicalPoint no longer transform points. The system returns all points to an application in its own coordinate space.
	/// This behavior preserves functionality for the majority of applications, but there are some exceptions in which you must make
	/// changes to ensure that the application works as expected. In those cases, use PhysicalToLogicalPointForPerMonitorDPI and LogicalToPhysicalPointForPerMonitorDPI.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-physicaltologicalpoint BOOL PhysicalToLogicalPoint( HWND
	// hWnd, LPPOINT lpPoint );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "physicaltologicalpoint")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool PhysicalToLogicalPoint(HWND hWnd, ref POINT lpPoint);

	/// <summary>
	/// The <c>PrintWindow</c> function copies a visual window into the specified device context (DC), typically a printer DC.
	/// </summary>
	/// <param name="hwnd">A handle to the window that will be copied.</param>
	/// <param name="hdcBlt">A handle to the device context.</param>
	/// <param name="nFlags">
	/// <para>The drawing options. It can be one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>PW_CLIENTONLY</term>
	/// <term>Only the client area of the window is copied to hdcBlt. By default, the entire window is copied.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>If the function succeeds, it returns a nonzero value.</para>
	/// <para>If the function fails, it returns zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// <c>Note</c> This is a blocking or synchronous function and might not return immediately. How quickly this function returns
	/// depends on run-time factors such as network status, print server configuration, and printer driver implementation—factors that
	/// are difficult to predict when writing an application. Calling this function from a thread that manages interaction with the user
	/// interface could make the application appear to be unresponsive.
	/// </para>
	/// <para>
	/// The application that owns the window referenced by hWnd processes the <c>PrintWindow</c> call and renders the image in the device
	/// context that is referenced by hdcBlt. The application receives a WM_PRINT message or, if the <c>PW_PRINTCLIENT</c> flag is
	/// specified, a WM_PRINTCLIENT message. For more information, see <c>WM_PRINT</c> and <c>WM_PRINTCLIENT</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-printwindow BOOL PrintWindow( HWND hwnd, HDC hdcBlt, UINT
	// nFlags );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "00b38cd8-1cfb-408e-88da-6e61563d9d8e")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool PrintWindow(HWND hwnd, HDC hdcBlt, PW nFlags);

	/// <summary>
	/// <para>
	/// Retrieves a handle to the child window at the specified point. The search is restricted to immediate child windows; grandchildren
	/// and deeper descendant windows are not searched.
	/// </para>
	/// </summary>
	/// <param name="hwndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose child is to be retrieved.</para>
	/// </param>
	/// <param name="ptParentClientCoords">
	/// <para>Type: <c>POINT</c></para>
	/// <para>A POINT structure that defines the client coordinates of the point to be checked.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>The return value is a handle to the child window that contains the specified point.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// <c>RealChildWindowFromPoint</c> treats <c>HTTRANSPARENT</c> areas of a standard control differently from other areas of the
	/// control; it returns the child window behind a transparent part of a control. In contrast, ChildWindowFromPoint treats
	/// <c>HTTRANSPARENT</c> areas of a control the same as other areas. For example, if the point is in a transparent area of a
	/// groupbox, <c>RealChildWindowFromPoint</c> returns the child window behind a groupbox, whereas <c>ChildWindowFromPoint</c> returns
	/// the groupbox. However, both APIs return a static field, even though it, too, returns <c>HTTRANSPARENT</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-realchildwindowfrompoint HWND RealChildWindowFromPoint(
	// HWND hwndParent, POINT ptParentClientCoords );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "realchildwindowfrompoint")]
	public static extern HWND RealChildWindowFromPoint(HWND hwndParent, POINT ptParentClientCoords);

	/// <summary>
	/// <para>Retrieves a string that specifies the window type.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window whose type will be retrieved.</para>
	/// </param>
	/// <param name="ptszClassName">
	/// <para>Type: <c>LPTSTR</c></para>
	/// <para>A pointer to a string that receives the window type.</para>
	/// </param>
	/// <param name="cchClassNameMax">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The length, in characters, of the buffer pointed to by the pszType parameter.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>UINT</c></c></para>
	/// <para>If the function succeeds, the return value is the number of characters copied to the specified buffer.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-realgetwindowclassw UINT RealGetWindowClassW( HWND hwnd,
	// LPWSTR ptszClassName, UINT cchClassNameMax );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "realgetwindowclass")]
	public static extern uint RealGetWindowClass(HWND hwnd, StringBuilder ptszClassName, uint cchClassNameMax);

	/// <summary>
	/// <para>Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.</para>
	/// <para>
	/// <c>Note</c> The <c>RegisterClass</c> function has been superseded by the RegisterClassEx function. You can still use
	/// <c>RegisterClass</c>, however, if you do not need to set the class small icon.
	/// </para>
	/// </summary>
	/// <param name="lpWndClass">
	/// <para>Type: <c>const WNDCLASS*</c></para>
	/// <para>
	/// A pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ATOM</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. This atom can
	/// only be used by the CreateWindow, CreateWindowEx, GetClassInfo, GetClassInfoEx, FindWindow, FindWindowEx, and UnregisterClass
	/// functions and the <c>IActiveIMMap::FilterClientWindows</c> method.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you register the window class by using <c>RegisterClassA</c>, the application tells the system that the windows of the created
	/// class expect messages with text or character parameters to use the ANSI character set; if you register it by using
	/// <c>RegisterClassW</c>, the application requests that the system pass text parameters of messages as Unicode. The IsWindowUnicode
	/// function enables applications to query the nature of each window. For more information on ANSI and Unicode functions, see
	/// Conventions for Function Prototypes.
	/// </para>
	/// <para>All window classes that an application registers are unregistered when it terminates.</para>
	/// <para>
	/// No window classes registered by a DLL are unregistered when the DLL is unloaded. A DLL must explicitly unregister its classes
	/// when it is unloaded.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Associating a Window Procedure with a Window Class.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerclassa ATOM RegisterClassA( const WNDCLASSA
	// *lpWndClass );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern Kernel32.ATOM RegisterClass(in WNDCLASS lpWndClass);

	/// <summary>Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.</summary>
	/// <param name="Arg1">
	/// <para>Type: <c>const WNDCLASSEX*</c></para>
	/// <para>
	/// A pointer to a WNDCLASSEX structure. You must fill the structure with the appropriate class attributes before passing it to the function.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ATOM</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. This atom can
	/// only be used by the CreateWindow, CreateWindowEx, GetClassInfo, GetClassInfoEx, FindWindow, FindWindowEx, and UnregisterClass
	/// functions and the <c>IActiveIMMap::FilterClientWindows</c> method.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you register the window class by using <c>RegisterClassExA</c>, the application tells the system that the windows of the
	/// created class expect messages with text or character parameters to use the ANSI character set; if you register it by using
	/// <c>RegisterClassExW</c>, the application requests that the system pass text parameters of messages as Unicode. The
	/// IsWindowUnicode function enables applications to query the nature of each window. For more information on ANSI and Unicode
	/// functions, see Conventions for Function Prototypes.
	/// </para>
	/// <para>All window classes that an application registers are unregistered when it terminates.</para>
	/// <para>
	/// No window classes registered by a DLL are unregistered when the DLL is unloaded. A DLL must explicitly unregister its classes
	/// when it is unloaded.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Using Window Classes.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerclassexa ATOM RegisterClassExA( const WNDCLASSEXA
	// *Arg1 );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern Kernel32.ATOM RegisterClassEx(in WNDCLASSEX Arg1);

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>Registers a specified Shell window to receive certain messages for events or notifications that are useful to Shell applications.</para>
	/// <para>
	/// The event messages received are only those sent to the Shell window associated with the specified window's desktop. Many of the
	/// messages are the same as those that can be received after calling the SetWindowsHookEx function and specifying <c>WH_SHELL</c>
	/// for the hook type. The difference with <c>RegisterShellHookWindow</c> is that the messages are received through the specified
	/// window's WindowProc and not through a call back procedure.
	/// </para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window to register for Shell hook messages.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para><c>TRUE</c> if the function succeeds; otherwise, <c>FALSE</c>.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// As with normal window messages, the second parameter of the window procedure identifies the message as a
	/// <c>WM_SHELLHOOKMESSAGE</c>. However, for these Shell hook messages, the message value is not a pre-defined constant like other
	/// message IDs such as WM_COMMAND. The value must be obtained dynamically using a call to RegisterWindowMessage as shown here:
	/// </para>
	/// <para>
	/// This precludes handling these messages using a traditional switch statement which requires ID values that are known at compile
	/// time. For handling Shell hook messages, the normal practice is to code an If statement in the default section of your switch
	/// statement and then handle the message if the value of the message ID is the same as the value obtained from the
	/// RegisterWindowMessage call.
	/// </para>
	/// <para>
	/// The following table describes the wParam and lParam parameter values passed to the window procedure for the Shell hook messages.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>wParam</term>
	/// <term>lParam</term>
	/// </listheader>
	/// <item>
	/// <term>HSHELL_GETMINRECT</term>
	/// <term>A pointer to a SHELLHOOKINFO structure.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_WINDOWACTIVATED</term>
	/// <term>A handle to the activated window.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_RUDEAPPACTIVATED</term>
	/// <term>A handle to the activated window.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_WINDOWREPLACING</term>
	/// <term>A handle to the window replacing the top-level window.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_WINDOWREPLACED</term>
	/// <term>A handle to the window being replaced.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_WINDOWCREATED</term>
	/// <term>A handle to the window being created.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_WINDOWDESTROYED</term>
	/// <term>A handle to the top-level window being destroyed.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_ACTIVATESHELLWINDOW</term>
	/// <term>Not used.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_TASKMAN</term>
	/// <term>Can be ignored.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_REDRAW</term>
	/// <term>A handle to the window that needs to be redrawn.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_FLASH</term>
	/// <term>A handle to the window that needs to be flashed.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_ENDTASK</term>
	/// <term>A handle to the window that should be forced to exit.</term>
	/// </item>
	/// <item>
	/// <term>HSHELL_APPCOMMAND</term>
	/// <term>
	/// The APPCOMMAND which has been unhandled by the application or other hooks. See WM_APPCOMMAND and use the GET_APPCOMMAND_LPARAM
	/// macro to retrieve this parameter.
	/// </term>
	/// </item>
	/// <item>
	/// <term>HSHELL_MONITORCHANGED</term>
	/// <term>A handle to the window that moved to a different monitor.</term>
	/// </item>
	/// </list>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server
	/// 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registershellhookwindow BOOL RegisterShellHookWindow( HWND
	// hwnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "registershellhookwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool RegisterShellHookWindow(HWND hwnd);

	/// <summary>
	/// Releases the mouse capture from a window in the current thread and restores normal mouse input processing. A window that has
	/// captured the mouse receives all mouse input, regardless of the position of the cursor, except when a mouse button is clicked
	/// while the cursor hot spot is in the window of another thread.
	/// </summary>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>An application calls this function after calling the SetCapture function.</para>
	/// <para>Examples</para>
	/// <para>For an example, see Drawing Lines with the Mouse.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-releasecapture BOOL ReleaseCapture( );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ReleaseCapture();

	/// <summary>Activates a window. The window must be attached to the calling thread's message queue.</summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the top-level window to be activated.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>If the function succeeds, the return value is the handle to the window that was previously active.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>SetActiveWindow</c> function activates a window, but not if the application is in the background. The window will be
	/// brought into the foreground (top of Z-Order) if its application is in the foreground when the system activates the window.
	/// </para>
	/// <para>
	/// If the window identified by the hWnd parameter was created by the calling thread, the active window status of the calling thread
	/// is set to hWnd. Otherwise, the active window status of the calling thread is set to <c>NULL</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setactivewindow HWND SetActiveWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND SetActiveWindow(HWND hWnd);

	/// <summary>
	/// <note type="warning"><c>SetAdditionalForegroundBoostProcesses</c> is a <c>limited access feature</c>. Contact
	/// foregroundboostprocs@microsoft.com for more information.</note>
	/// <para>
	/// SetAdditionalForegroundBoostProcesses is a performance assist API to help applications with a multi-process application model
	/// where multiple processes contribute to a foreground experience, either as data or rendering. Examples include browsers (with the
	/// browser manager or frame, tabs, plugins, etc. hosted in different processes) and IDEs (which spawn processes for compilation and
	/// other tasks).
	/// </para>
	/// <para>
	/// Applications can use this API to provide a foreground priority boost to worker processes that help support the main application.
	/// Such applications can have a uniform priority boost applied to all of their constituent processes when the application's top
	/// level window is in the foreground.
	/// </para>
	/// </summary>
	/// <param name="topLevelWindow">A handle to the top level window (HWND) of the application.</param>
	/// <param name="processHandleCount">
	/// The number of process handles in <c>processHandleArray</c>. This function can be called at a single time with a maximum of 32
	/// handles. Set this parameter to <c>0</c> along with setting <c>processHandleArray</c> to <c>NULL</c> to clear a prior boost configuration.
	/// </param>
	/// <param name="processHandleArray">
	/// A group of process handles to be foreground boosted or de-boosted. Set this parameter to <c>NULL</c> along with setting
	/// <c>processHandleCount</c> to <c>0</c> to clear a prior boost configuration.
	/// </param>
	/// <returns>
	/// Returns <c>TRUE</c> if the call succeeds in boosting the application, <c>FALSE</c> otherwise.
	/// <c>SetAdditionalForegroundBoostProcesses</c> sets the last error code, so the application can call GetLastError() to obtain
	/// extended information if the call failed (for example, ERROR_INVALID_PARAMETER, ERROR_NOT_ENOUGH_MEMORY, or ERROR_ACCESS_DENIED).
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function takes a group of process handles that all get foreground boosted or de-boosted when the passed-in top level HWND
	/// moves to the foreground or background respectively. Whenever the passed-in top level HWND becomes the foreground window, a
	/// foreground boost will also be applied to the processes passed in the handle array. A similar de-boost happens when the top level
	/// HWND moves to the background.
	/// </para>
	/// <para>
	/// The top level HWND passed to this function must be owned by the calling process. The calling process should have the
	/// <c>PROCESS_SET_INFORMATION</c> access right on the process handles in the <c>processHandleArray</c> - in other words, you must
	/// have full control of every window in your process. If some external component injects a window that takes foreground, or if a
	/// dialog box appears, then you lose your boost.
	/// </para>
	/// <para>If you have two top level windows, you need to call this function for each one.</para>
	/// <para>
	/// If the passed-in top level HWND is already in the foreground when <c>SetAdditionalForegroundBoostProcesses</c> is called, all of
	/// the processes in the <c>processHandleArray</c> are immediately boosted.
	/// </para>
	/// <para>
	/// A process whose handle is in the <c>processHandleArray</c> will get a foreground boost only when the top level HWND becomes the
	/// foreground window.
	/// </para>
	/// <para>Additional foreground boost is applied only when:</para>
	/// <list type="number">
	/// <item>
	/// <term>The foreground window changes, or</term>
	/// </item>
	/// <item>
	/// <term>
	/// If this function is called while the window is in the foreground and the new list has the process handle, or the list does not
	/// include the process handle while it was previously included.
	/// </term>
	/// </item>
	/// </list>
	/// <para>
	/// When the process owning the top level HWND exits or terminates, the additional boosting relationship is torn down and secondary
	/// processes do not receive any additional foreground boosting.
	/// </para>
	/// <para>
	/// The primary process's top level HWND will continue to hold references to secondary processes until either the primary process's
	/// top level HWND clears its grouped boost state, or the HWND is destroyed.
	/// </para>
	/// </remarks>
	/// <example>
	/// <para>
	/// In this simple scenario, the application sets up its foreground process boost configuration when the top level window is created.
	/// When WM_CREATE is handled, the function is called with handles in the lParam and the count of handles in the wParam. These
	/// processes will get foreground or background priority boosted as m_AppWindow moves in and out of being the foreground window. If
	/// the m_AppWindow is the foreground window when the function is called, the processes will also get an immediate foreground
	/// priority boost.
	/// </para>
	/// <code language="cpp"><![CDATA[case WM_CREATE:   
	///
	///	  // 
	///	  // Configure the passed in worker processes (handles) in lParam, to get foreground priority boost when m_AppWindow moves in and 
	///	  // out of the foreground. 
	///	  //  
	///	  
	///	  HANDLE* pMyHandles = retinterpret_cast<HANDLE*>(lParam);
	///	  DWORD cHandles = reinterpret_cast<DWORD>(wParam);
	///	  
	///	  if (!SetAdditionalForegroundBoostProcesses(m_AppWindow, cHandles, pMyHandles))
	///	  {
	///	  	printf(“SetAdditionalForegroundBoostProcesses() setup failed with error code: % d\n”, GetLastError());
	///	  } 
	///	  
	///   break;]]></code>
	/// </example>
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setadditionalforegroundboostprocesses
	// BOOL SetAdditionalForegroundBoostProcesses( HWND topLevelWindow, DWORD processHandleCount, HANDLE *processHandleArray );
	[PInvokeData("Winuser.h", MSDNShortId = "NF:winuser.SetAdditionalForegroundBoostProcesses", MinClient = PInvokeClient.Windows11)]
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetAdditionalForegroundBoostProcesses(HWND topLevelWindow, uint processHandleCount,
		[Optional, In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] HPROCESS[]? processHandleArray);

	/// <summary>
	/// <para>
	/// Sets the mouse capture to the specified window belonging to the current thread. <c>SetCapture</c> captures mouse input either
	/// when the mouse is over the capturing window, or when the mouse button was pressed while the mouse was over the capturing window
	/// and the button is still down. Only one window at a time can capture the mouse.
	/// </para>
	/// <para>
	/// If the mouse cursor is over a window created by another thread, the system will direct mouse input to the specified window only
	/// if a mouse button is down.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window in the current thread that is to capture the mouse.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// The return value is a handle to the window that had previously captured the mouse. If there is no such window, the return value
	/// is <c>NULL</c>.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Only the foreground window can capture the mouse. When a background window attempts to do so, the window receives messages only
	/// for mouse events that occur when the cursor hot spot is within the visible portion of the window. Also, even if the foreground
	/// window has captured the mouse, the user can still click another window, bringing it to the foreground.
	/// </para>
	/// <para>
	/// When the window no longer requires all mouse input, the thread that created the window should call the ReleaseCapture function to
	/// release the mouse.
	/// </para>
	/// <para>This function cannot be used to capture mouse input meant for another process.</para>
	/// <para>When the mouse is captured, menu hotkeys and other keyboard accelerators do not work.</para>
	/// <para>Examples</para>
	/// <para>For an example, see Drawing Lines with the Mouse.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setcapture HWND SetCapture( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND SetCapture(HWND hWnd);

	/// <summary>
	/// Replaces the specified value at the specified offset in the extra class memory or the WNDCLASSEX structure for the class to which
	/// the specified window belongs.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be replaced. To set a value in the extra class memory, specify the positive, zero-based byte offset of the value to
	/// be set. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for example, if you
	/// specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To set a value other than
	/// the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>
	/// Sets the size, in bytes, of the extra memory associated with the class. Setting this value does not change the number of extra
	/// bytes already allocated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Sets the size, in bytes, of the extra window memory associated with each window in the class. Setting this value does not change
	/// the number of extra bytes already allocated. For information on how to access this memory, see SetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_ HBRBACKGROUND -10</term>
	/// <term>Replaces a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Replaces a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Replaces a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Replaces a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Replaces the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Replaces the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>Replaces the pointer to the window procedure associated with the class.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="dwNewLong">
	/// <para>Type: <c>LONG_PTR</c></para>
	/// <para>The replacement value.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the previous value of the specified offset. If this was not previously set, the
	/// return value is zero.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you use the <c>SetClassLongPtr</c> function and the <c>GCLP_WNDPROC</c> index to replace the window procedure, the window
	/// procedure must conform to the guidelines specified in the description of the WindowProc callback function.
	/// </para>
	/// <para>
	/// Calling <c>SetClassLongPtr</c> with the <c>GCLP_WNDPROC</c> index creates a subclass of the window class that affects all windows
	/// subsequently created with the class. An application can subclass a system class, but should not subclass a window class created
	/// by another process.
	/// </para>
	/// <para>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </para>
	/// <para>
	/// Use the <c>SetClassLongPtr</c> function with care. For example, it is possible to change the background color for a class by
	/// using <c>SetClassLongPtr</c>, but this change does not immediately repaint all windows belonging to the class.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclasslongptra ULONG_PTR SetClassLongPtrA( HWND hWnd,
	// int nIndex, LONG_PTR dwNewLong );
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static IntPtr SetClassLong(HWND hWnd, int nIndex, IntPtr dwNewLong) => IntPtr.Size > 4 ? SetClassLongPtr(hWnd, nIndex, dwNewLong) : (IntPtr)SetClassLong32(hWnd, nIndex, dwNewLong.ToInt32());

	/// <summary>
	/// Replaces the specified value at the specified offset in the extra class memory or the WNDCLASSEX structure for the class to which
	/// the specified window belongs.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be replaced. To set a value in the extra class memory, specify the positive, zero-based byte offset of the value to
	/// be set. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for example, if you
	/// specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To set a value other than
	/// the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>
	/// Sets the size, in bytes, of the extra memory associated with the class. Setting this value does not change the number of extra
	/// bytes already allocated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Sets the size, in bytes, of the extra window memory associated with each window in the class. Setting this value does not change
	/// the number of extra bytes already allocated. For information on how to access this memory, see SetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_ HBRBACKGROUND -10</term>
	/// <term>Replaces a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Replaces a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Replaces a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Replaces a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Replaces the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Replaces the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>Replaces the pointer to the window procedure associated with the class.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="dwNewLong">
	/// <para>Type: <c>LONG_PTR</c></para>
	/// <para>The replacement value.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the previous value of the specified offset. If this was not previously set, the
	/// return value is zero.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you use the <c>SetClassLongPtr</c> function and the <c>GCLP_WNDPROC</c> index to replace the window procedure, the window
	/// procedure must conform to the guidelines specified in the description of the WindowProc callback function.
	/// </para>
	/// <para>
	/// Calling <c>SetClassLongPtr</c> with the <c>GCLP_WNDPROC</c> index creates a subclass of the window class that affects all windows
	/// subsequently created with the class. An application can subclass a system class, but should not subclass a window class created
	/// by another process.
	/// </para>
	/// <para>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </para>
	/// <para>
	/// Use the <c>SetClassLongPtr</c> function with care. For example, it is possible to change the background color for a class by
	/// using <c>SetClassLongPtr</c>, but this change does not immediately repaint all windows belonging to the class.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclasslongptra ULONG_PTR SetClassLongPtrA( HWND hWnd,
	// int nIndex, LONG_PTR dwNewLong );
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static IntPtr SetClassLong(HWND hWnd, GetClassLongFlag nIndex, IntPtr dwNewLong) => SetClassLong(hWnd, (int)nIndex, dwNewLong);

	/// <summary>
	/// <para>
	/// Replaces the 16-bit ( <c>WORD</c>) value at the specified offset into the extra class memory for the window class to which the
	/// specified window belongs.
	/// </para>
	/// <para>
	/// <c>Note</c> This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the
	/// SetClassLong function.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The zero-based byte offset of the value to be replaced. Valid values are in the range zero through the number of bytes of class
	/// memory minus two; for example, if you specified 10 or more bytes of extra class memory, a value of 8 would be an index to the
	/// fifth 16-bit integer.
	/// </para>
	/// </param>
	/// <param name="wNewWord">
	/// <para>Type: <c>WORD</c></para>
	/// <para>The replacement value.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>WORD</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the previous value of the specified 16-bit integer. If the value was not previously
	/// set, the return value is zero.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASS structure used with the
	/// RegisterClass function.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclassword WORD SetClassWord( HWND hWnd, int nIndex,
	// WORD wNewWord );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern ushort SetClassWord(HWND hWnd, int nIndex, ushort wNewWord);

	/// <summary>Sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue.</summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window that will receive the keyboard input. If this parameter is <c>NULL</c>, keystrokes are ignored.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// If the function succeeds, the return value is the handle to the window that previously had the keyboard focus. If the hWnd
	/// parameter is invalid or the window is not attached to the calling thread's message queue, the return value is <c>NULL</c>. To get
	/// extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>SetFocus</c> function sends a WM_KILLFOCUS message to the window that loses the keyboard focus and a WM_SETFOCUS message
	/// to the window that receives the keyboard focus. It also activates either the window that receives the focus or the parent of the
	/// window that receives the focus.
	/// </para>
	/// <para>
	/// If a window is active but does not have the focus, any key pressed will produce the WM_SYSCHAR, WM_SYSKEYDOWN, or WM_SYSKEYUP
	/// message. If the <c>VK_MENU</c> key is also pressed, the
	/// </para>
	/// <para>
	/// By using the AttachThreadInput function, a thread can attach its input processing to another thread. This allows a thread to call
	/// <c>SetFocus</c> to set the keyboard focus to a window attached to another thread's message queue.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Initializing a Dialog Box.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setfocus HWND SetFocus( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	public static extern HWND SetFocus([Optional] HWND hWnd);

	/// <summary>
	/// <para>
	/// Brings the thread that created the specified window into the foreground and activates the window. Keyboard input is directed to
	/// the window, and various visual cues are changed for the user. The system assigns a slightly higher priority to the thread that
	/// created the foreground window than it does to other threads.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window that should be activated and brought to the foreground.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window was brought to the foreground, the return value is nonzero.</para>
	/// <para>If the window was not brought to the foreground, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the
	/// following conditions is true:
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>The process is the foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The process was started by the foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The process received the last input event.</term>
	/// </item>
	/// <item>
	/// <term>There is no foreground process.</term>
	/// </item>
	/// <item>
	/// <term>The process is being debugged.</term>
	/// </item>
	/// <item>
	/// <term>The foreground process is not a Modern Application or the Start Screen.</term>
	/// </item>
	/// <item>
	/// <term>The foreground is not locked (see LockSetForegroundWindow).</term>
	/// </item>
	/// <item>
	/// <term>The foreground lock time-out has expired (see <c>SPI_GETFOREGROUNDLOCKTIMEOUT</c> in SystemParametersInfo).</term>
	/// </item>
	/// <item>
	/// <term>No menus are active.</term>
	/// </item>
	/// </list>
	/// <para>
	/// An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes
	/// the taskbar button of the window to notify the user.
	/// </para>
	/// <para>
	/// A process that can set the foreground window can enable another process to set the foreground window by calling the
	/// AllowSetForegroundWindow function. The process specified by dwProcessId loses the ability to set the foreground window the next
	/// time the user generates input, unless the input is directed at that process, or the next time a process calls
	/// <c>AllowSetForegroundWindow</c>, unless that process is specified.
	/// </para>
	/// <para>The foreground process can disable calls to <c>SetForegroundWindow</c> by calling the LockSetForegroundWindow function.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow BOOL SetForegroundWindow( HWND hWnd );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setforegroundwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetForegroundWindow(HWND hWnd);

	/// <summary>
	/// <para>Sets the opacity and transparency color key of a layered window.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the layered window. A layered window is created by specifying <c>WS_EX_LAYERED</c> when creating the window with the
	/// CreateWindowEx function or by setting <c>WS_EX_LAYERED</c> via SetWindowLong after the window has been created.
	/// </para>
	/// <para>
	/// <c>Windows 8:</c> The <c>WS_EX_LAYERED</c> style is supported for top-level windows and child windows. Previous Windows versions
	/// support <c>WS_EX_LAYERED</c> only for top-level windows.
	/// </para>
	/// </param>
	/// <param name="crKey">
	/// <para>Type: <c>COLORREF</c></para>
	/// <para>
	/// A COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted
	/// by the window in this color will be transparent. To generate a <c>COLORREF</c>, use the RGB macro.
	/// </para>
	/// </param>
	/// <param name="bAlpha">
	/// <para>Type: <c>BYTE</c></para>
	/// <para>
	/// Alpha value used to describe the opacity of the layered window. Similar to the <c>SourceConstantAlpha</c> member of the
	/// BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.
	/// </para>
	/// </param>
	/// <param name="dwFlags">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>An action to be taken. This parameter can be one or more of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>LWA_ALPHA 0x00000002</term>
	/// <term>Use bAlpha to determine the opacity of the layered window.</term>
	/// </item>
	/// <item>
	/// <term>LWA_COLORKEY 0x00000001</term>
	/// <term>Use crKey as the transparency color.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// Note that once <c>SetLayeredWindowAttributes</c> has been called for a layered window, subsequent UpdateLayeredWindow calls will
	/// fail until the layering style bit is cleared and set again.
	/// </para>
	/// <para>For more information, see Using Layered Windows.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setlayeredwindowattributes BOOL
	// SetLayeredWindowAttributes( HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setlayeredwindowattributes")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, byte bAlpha, LayeredWindowAttributes dwFlags);

	/// <summary>
	/// <para>Changes the parent window of the specified child window.</para>
	/// </summary>
	/// <param name="hWndChild">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the child window.</para>
	/// </param>
	/// <param name="hWndNewParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the new parent window. If this parameter is <c>NULL</c>, the desktop window becomes the new parent window. If this
	/// parameter is <c>HWND_MESSAGE</c>, the child window becomes a message-only window.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>If the function succeeds, the return value is a handle to the previous parent window.</para>
	/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>An application can use the <c>SetParent</c> function to set the parent window of a pop-up, overlapped, or child window.</para>
	/// <para>If the window identified by the hWndChild parameter is visible, the system performs the appropriate redrawing and repainting.</para>
	/// <para>
	/// For compatibility reasons, <c>SetParent</c> does not modify the <c>WS_CHILD</c> or <c>WS_POPUP</c> window styles of the window
	/// whose parent is being changed. Therefore, if hWndNewParent is <c>NULL</c>, you should also clear the <c>WS_CHILD</c> bit and set
	/// the <c>WS_POPUP</c> style after calling <c>SetParent</c>. Conversely, if hWndNewParent is not <c>NULL</c> and the window was
	/// previously a child of the desktop, you should clear the <c>WS_POPUP</c> style and set the <c>WS_CHILD</c> style before calling <c>SetParent</c>.
	/// </para>
	/// <para>
	/// When you change the parent of a window, you should synchronize the UISTATE of both windows. For more information, see
	/// WM_CHANGEUISTATE and WM_UPDATEUISTATE.
	/// </para>
	/// <para>
	/// Unexpected behavior or errors may occur if hWndNewParent and hWndChild are running in different DPI awareness modes. The table
	/// below outlines this behavior:
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Operation</term>
	/// <term>Windows 8.1</term>
	/// <term>Windows 10 (1607 and earlier)</term>
	/// <term>Windows 10 (1703 and later)</term>
	/// </listheader>
	/// <item>
	/// <term>SetParent (In-Proc)</term>
	/// <term>N/A</term>
	/// <term>Forced reset (of current process)</term>
	/// <term>Fail (ERROR_INVALID_STATE)</term>
	/// </item>
	/// <item>
	/// <term>SetParent (Cross-Proc)</term>
	/// <term>Forced reset (of child window's process)</term>
	/// <term>Forced reset (of child window's process)</term>
	/// <term>Forced reset (of child window's process)</term>
	/// </item>
	/// </list>
	/// <para>For more information on DPI awareness, see the Windows High DPI documentation.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setparent HWND SetParent( HWND hWndChild, HWND
	// hWndNewParent );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setparent")]
	public static extern HWND SetParent(HWND hWndChild, [Optional] HWND hWndNewParent);

	/// <summary>
	/// <para>Changes the default layout when windows are created with no parent or owner only for the currently running process.</para>
	/// </summary>
	/// <param name="dwDefaultLayout">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The default process layout. This parameter can be 0 or the following value.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>LAYOUT_RTL 0x00000001</term>
	/// <term>Sets the default horizontal layout to be right to left.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The layout specifies how text and graphics are laid out; the default is left to right. The <c>SetProcessDefaultLayout</c>
	/// function changes layout to be right to left, which is the standard in Arabic and Hebrew cultures.
	/// </para>
	/// <para>
	/// After the <c>LAYOUT_RTL</c> flag is selected, flags normally specifying right or left are reversed. To avoid confusion, consider
	/// defining alternate words for standard flags, such as those in the following table.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Standard flag</term>
	/// <term>Suggested alternate name</term>
	/// </listheader>
	/// <item>
	/// <term>WS_EX_RIGHT</term>
	/// <term>WS_EX_TRAILING</term>
	/// </item>
	/// <item>
	/// <term>WS_EX_RTLREADING</term>
	/// <term>WS_EX_REVERSEREADING</term>
	/// </item>
	/// <item>
	/// <term>WS_EX_LEFTSCROLLBAR</term>
	/// <term>WS_EX_LEADSCROLLBAR</term>
	/// </item>
	/// <item>
	/// <term>ES_LEFT</term>
	/// <term>ES_LEAD</term>
	/// </item>
	/// <item>
	/// <term>ES_RIGHT</term>
	/// <term>ES_TRAIL</term>
	/// </item>
	/// <item>
	/// <term>EC_LEFTMARGIN</term>
	/// <term>EC_LEADMARGIN</term>
	/// </item>
	/// <item>
	/// <term>EC_RIGHTMARGIN</term>
	/// <term>EC_TRAILMARGIN</term>
	/// </item>
	/// </list>
	/// <para>
	/// If using this function with a mirrored window, note that the <c>SetProcessDefaultLayout</c> function does not mirror the whole
	/// process and all the device contexts (DCs) created in it. It mirrors only the mirrored window's DCs. To mirror any DC, use the
	/// SetLayout function.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdefaultlayout BOOL SetProcessDefaultLayout(
	// DWORD dwDefaultLayout );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setprocessdefaultlayout")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetProcessDefaultLayout(DefaultLayout dwDefaultLayout);

	/// <summary>
	/// <para>This function has no parameters.</para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero. Otherwise, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>For more information, see Setting the default DPI awareness for a process.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setprocessdpiaware BOOL SetProcessDPIAware( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setprocessdpiaware")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetProcessDPIAware();

	/// <summary>Associates a Help context identifier with the specified window.</summary>
	/// <param name="arg1">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window with which to associate the Help context identifier.</para>
	/// </param>
	/// <param name="arg2">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>The Help context identifier.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>BOOL</c></para>
	/// <para>Returns nonzero if successful, or zero otherwise.</para>
	/// <para>To retrieve extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// If a child window does not have a Help context identifier, it inherits the identifier of its parent window. Likewise, if an owned
	/// window does not have a Help context identifier, it inherits the identifier of its owner window. This inheritance of Help context
	/// identifiers allows an application to set just one identifier for a dialog box and all of its controls.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowcontexthelpid BOOL SetWindowContextHelpId( HWND ,
	// DWORD );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "7e0963d1-5807-4db5-9abf-cdb21a03b525")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowContextHelpId(HWND arg1, uint arg2);

	/// <summary>
	/// <para>Stores the display affinity setting in kernel mode on the hWnd associated with the window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="dwAffinity">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>
	/// The display affinity setting. This setting specifies where the window's contents are can be displayed. Set this value to
	/// WDA_MONITOR to display the window's contents only on a monitor.
	/// </para>
	/// <para>Set this value to WDA_NONE to remove the monitor-only affinity.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>
	/// If the function succeeds, it returns <c>TRUE</c>; otherwise, it returns <c>FALSE</c> when, for example, the function call is made
	/// on a non top-level window. To get extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function and GetWindowDisplayAffinity are designed to support the window content protection feature that is new to Windows
	/// 7. This feature enables applications to protect their own onscreen window content from being captured or copied through a
	/// specific set of public operating system features and APIs. However, it works only when the Desktop Window Manager(DWM) is
	/// composing the desktop.
	/// </para>
	/// <para>
	/// It is important to note that unlike a security feature or an implementation of Digital Rights Management (DRM), there is no
	/// guarantee that using <c>SetWindowDisplayAffinity</c> and GetWindowDisplayAffinity, and other necessary functions such as
	/// DwmIsCompositionEnabled, will strictly protect windowed content, for example where someone takes a photograph of the screen.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowdisplayaffinity BOOL SetWindowDisplayAffinity(
	// HWND hWnd, DWORD dwAffinity );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setwindowdisplayaffinity")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowDisplayAffinity(HWND hWnd, WindowDisplayAffinity dwAffinity);

	/// <summary>Sets the feedback configuration for a window.</summary>
	/// <param name="hwnd">The window to configure feedback on.</param>
	/// <param name="feedback">One of the values from the FEEDBACK_TYPE enumeration.</param>
	/// <param name="dwFlags">Reserved. Must be 0.</param>
	/// <param name="size">
	/// The size, in bytes, of the configuration data. Must be sizeof(BOOL) or 0 if the feedback setting is being reset.
	/// </param>
	/// <param name="configuration">The configuration data. Must be BOOL or NULL if the feedback setting is being reset.</param>
	/// <returns>Returns TRUE if successful; otherwise, returns FALSE.</returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowfeedbacksetting BOOL SetWindowFeedbackSetting(
	// HWND hwnd, FEEDBACK_TYPE feedback, DWORD dwFlags, UINT32 size, const VOID *configuration );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "72bee160-7004-40be-9c91-e431b06ccaed")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowFeedbackSetting(HWND hwnd, FEEDBACK_TYPE feedback, [Optional] uint dwFlags, uint size, [Optional] IntPtr configuration);

	/// <summary>
	/// <para>Sets the show state and the restored, minimized, and maximized positions of the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="lpwndpl">
	/// <para>Type: <c>const WINDOWPLACEMENT*</c></para>
	/// <para>A pointer to a WINDOWPLACEMENT structure that specifies the new show state and window positions.</para>
	/// <para>
	/// Before calling <c>SetWindowPlacement</c>, set the <c>length</c> member of the WINDOWPLACEMENT structure to sizeof(
	/// <c>WINDOWPLACEMENT</c>). <c>SetWindowPlacement</c> fails if the <c>length</c> member is not set correctly.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the information specified in WINDOWPLACEMENT would result in a window that is completely off the screen, the system will
	/// automatically adjust the coordinates so that the window is visible, taking into account changes in screen resolution and multiple
	/// monitor configuration.
	/// </para>
	/// <para>
	/// The <c>length</c> member of WINDOWPLACEMENT must be set to . If this member is not set correctly, the function returns
	/// <c>FALSE</c>. For additional remarks on the proper use of window placement coordinates, see <c>WINDOWPLACEMENT</c>.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowplacement BOOL SetWindowPlacement( HWND hWnd,
	// CONST WINDOWPLACEMENT *lpwndpl );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setwindowplacement")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowPlacement(HWND hWnd, ref WINDOWPLACEMENT lpwndpl);

	/// <summary>
	/// <para>
	/// Changes the size, position, and Z order of a child, pop-up, or top-level window. These windows are ordered according to their
	/// appearance on the screen. The topmost window receives the highest rank and is the first window in the Z order.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="hWndInsertAfter">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the
	/// following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>HWND_BOTTOM (HWND)1</term>
	/// <term>
	/// Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window, the window loses its topmost
	/// status and is placed at the bottom of all other windows.
	/// </term>
	/// </item>
	/// <item>
	/// <term>HWND_NOTOPMOST (HWND)-2</term>
	/// <term>
	/// Places the window above all non-topmost windows (that is, behind all topmost windows). This flag has no effect if the window is
	/// already a non-topmost window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>HWND_TOP (HWND)0</term>
	/// <term>Places the window at the top of the Z order.</term>
	/// </item>
	/// <item>
	/// <term>HWND_TOPMOST (HWND)-1</term>
	/// <term>Places the window above all non-topmost windows. The window maintains its topmost position even when it is deactivated.</term>
	/// </item>
	/// </list>
	/// <para>For more information about how this parameter is used, see the following Remarks section.</para>
	/// </param>
	/// <param name="X">
	/// <para>Type: <c>int</c></para>
	/// <para>The new position of the left side of the window, in client coordinates.</para>
	/// </param>
	/// <param name="Y">
	/// <para>Type: <c>int</c></para>
	/// <para>The new position of the top of the window, in client coordinates.</para>
	/// </param>
	/// <param name="cx">
	/// <para>Type: <c>int</c></para>
	/// <para>The new width of the window, in pixels.</para>
	/// </param>
	/// <param name="cy">
	/// <para>Type: <c>int</c></para>
	/// <para>The new height of the window, in pixels.</para>
	/// </param>
	/// <param name="uFlags">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The window sizing and positioning flags. This parameter can be a combination of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>SWP_ASYNCWINDOWPOS 0x4000</term>
	/// <term>
	/// If the calling thread and the thread that owns the window are attached to different input queues, the system posts the request to
	/// the thread that owns the window. This prevents the calling thread from blocking its execution while other threads process the request.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_DEFERERASE 0x2000</term>
	/// <term>Prevents generation of the WM_SYNCPAINT message.</term>
	/// </item>
	/// <item>
	/// <term>SWP_DRAWFRAME 0x0020</term>
	/// <term>Draws a frame (defined in the window's class description) around the window.</term>
	/// </item>
	/// <item>
	/// <term>SWP_FRAMECHANGED 0x0020</term>
	/// <term>
	/// Applies new frame styles set using the SetWindowLong function. Sends a WM_NCCALCSIZE message to the window, even if the window's
	/// size is not being changed. If this flag is not specified, WM_NCCALCSIZE is sent only when the window's size is being changed.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_HIDEWINDOW 0x0080</term>
	/// <term>Hides the window.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOACTIVATE 0x0010</term>
	/// <term>
	/// Does not activate the window. If this flag is not set, the window is activated and moved to the top of either the topmost or
	/// non-topmost group (depending on the setting of the hWndInsertAfter parameter).
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOCOPYBITS 0x0100</term>
	/// <term>
	/// Discards the entire contents of the client area. If this flag is not specified, the valid contents of the client area are saved
	/// and copied back into the client area after the window is sized or repositioned.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOMOVE 0x0002</term>
	/// <term>Retains the current position (ignores X and Y parameters).</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOOWNERZORDER 0x0200</term>
	/// <term>Does not change the owner window's position in the Z order.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOREDRAW 0x0008</term>
	/// <term>
	/// Does not redraw changes. If this flag is set, no repainting of any kind occurs. This applies to the client area, the nonclient
	/// area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of the window being
	/// moved. When this flag is set, the application must explicitly invalidate or redraw any parts of the window and parent window that
	/// need redrawing.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SWP_NOREPOSITION 0x0200</term>
	/// <term>Same as the SWP_NOOWNERZORDER flag.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOSENDCHANGING 0x0400</term>
	/// <term>Prevents the window from receiving the WM_WINDOWPOSCHANGING message.</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOSIZE 0x0001</term>
	/// <term>Retains the current size (ignores the cx and cy parameters).</term>
	/// </item>
	/// <item>
	/// <term>SWP_NOZORDER 0x0004</term>
	/// <term>Retains the current Z order (ignores the hWndInsertAfter parameter).</term>
	/// </item>
	/// <item>
	/// <term>SWP_SHOWWINDOW 0x0040</term>
	/// <term>Displays the window.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// As part of the Vista re-architecture, all services were moved off the interactive desktop into Session 0. hwnd and window manager
	/// operations are only effective inside a session and cross-session attempts to manipulate the hwnd will fail. For more information,
	/// see The Windows Vista Developer Story: Application Compatibility Cookbook.
	/// </para>
	/// <para>
	/// If you have changed certain window data using SetWindowLong, you must call <c>SetWindowPos</c> for the changes to take effect.
	/// Use the following combination for uFlags: .
	/// </para>
	/// <para>
	/// A window can be made a topmost window either by setting the hWndInsertAfter parameter to <c>HWND_TOPMOST</c> and ensuring that
	/// the <c>SWP_NOZORDER</c> flag is not set, or by setting a window's position in the Z order so that it is above any existing
	/// topmost windows. When a non-topmost window is made topmost, its owned windows are also made topmost. Its owners, however, are not changed.
	/// </para>
	/// <para>
	/// If neither the <c>SWP_NOACTIVATE</c> nor <c>SWP_NOZORDER</c> flag is specified (that is, when the application requests that a
	/// window be simultaneously activated and its position in the Z order changed), the value specified in hWndInsertAfter is used only
	/// in the following circumstances.
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>Neither the <c>HWND_TOPMOST</c> nor <c>HWND_NOTOPMOST</c> flag is specified in hWndInsertAfter.</term>
	/// </item>
	/// <item>
	/// <term>The window identified by hWnd is not the active window.</term>
	/// </item>
	/// </list>
	/// <para>
	/// An application cannot activate an inactive window without also bringing it to the top of the Z order. Applications can change an
	/// activated window's position in the Z order without restrictions, or it can activate a window and then move it to the top of the
	/// topmost or non-topmost windows.
	/// </para>
	/// <para>
	/// If a topmost window is repositioned to the bottom ( <c>HWND_BOTTOM</c>) of the Z order or after any non-topmost window, it is no
	/// longer topmost. When a topmost window is made non-topmost, its owners and its owned windows are also made non-topmost windows.
	/// </para>
	/// <para>
	/// A non-topmost window can own a topmost window, but the reverse cannot occur. Any window (for example, a dialog box) owned by a
	/// topmost window is itself made a topmost window, to ensure that all owned windows stay above their owner.
	/// </para>
	/// <para>If an application is not in the foreground, and should be in the foreground, it must call the SetForegroundWindow function.</para>
	/// <para>
	/// To use <c>SetWindowPos</c> to bring a window to the top, the process that owns the window must have SetForegroundWindow permission.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Initializing a Dialog Box.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos BOOL SetWindowPos( HWND hWnd, HWND
	// hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "setwindowpos")]
	[System.Security.SecurityCritical]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

	/// <summary>
	/// <para>
	/// Changes the text of the specified window's title bar (if it has one). If the specified window is a control, the text of the
	/// control is changed. However, <c>SetWindowText</c> cannot change the text of a control in another application.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window or control whose text is to be changed.</para>
	/// </param>
	/// <param name="lpString">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>The new title or control text.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If the target window is owned by the current process, <c>SetWindowText</c> causes a WM_SETTEXT message to be sent to the
	/// specified window or control. If the control is a list box control created with the <c>WS_CAPTION</c> style, however,
	/// <c>SetWindowText</c> sets the text for the control, not for the list box entries.
	/// </para>
	/// <para>To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling <c>SetWindowText</c>.</para>
	/// <para>
	/// The <c>SetWindowText</c> function does not expand tab characters (ASCII code 0x09). Tab characters are displayed as vertical bar
	/// (|) characters.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Sending a Message.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowtexta BOOL SetWindowTextA( HWND hWnd, LPCSTR
	// lpString );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "setwindowtext")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SetWindowText(HWND hWnd, [Optional, MarshalAs(UnmanagedType.LPTStr)] string? lpString);

	/// <summary>
	/// <para>Shows or hides all pop-up windows owned by the specified window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window that owns the pop-up windows to be shown or hidden.</para>
	/// </param>
	/// <param name="fShow">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>
	/// If this parameter is <c>TRUE</c>, all hidden pop-up windows are shown. If this parameter is <c>FALSE</c>, all visible pop-up
	/// windows are hidden.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// <c>ShowOwnedPopups</c> shows only windows hidden by a previous call to <c>ShowOwnedPopups</c>. For example, if a pop-up window is
	/// hidden by using the ShowWindow function, subsequently calling <c>ShowOwnedPopups</c> with the fShow parameter set to <c>TRUE</c>
	/// does not cause the window to be shown.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-showownedpopups BOOL ShowOwnedPopups( HWND hWnd, BOOL
	// fShow );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "showownedpopups")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ShowOwnedPopups(HWND hWnd, [MarshalAs(UnmanagedType.Bool)] bool fShow);

	/// <summary>
	/// <para>Sets the specified window's show state.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="nCmdShow">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// Controls how the window is to be shown. This parameter is ignored the first time an application calls <c>ShowWindow</c>, if the
	/// program that launched the application provides a STARTUPINFO structure. Otherwise, the first time <c>ShowWindow</c> is called,
	/// the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can
	/// be one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>SW_FORCEMINIMIZE 11</term>
	/// <term>
	/// Minimizes a window, even if the thread that owns the window is not responding. This flag should only be used when minimizing
	/// windows from a different thread.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_HIDE 0</term>
	/// <term>Hides the window and activates another window.</term>
	/// </item>
	/// <item>
	/// <term>SW_MAXIMIZE 3</term>
	/// <term>Maximizes the specified window.</term>
	/// </item>
	/// <item>
	/// <term>SW_MINIMIZE 6</term>
	/// <term>Minimizes the specified window and activates the next top-level window in the Z order.</term>
	/// </item>
	/// <item>
	/// <term>SW_RESTORE 9</term>
	/// <term>
	/// Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and
	/// position. An application should specify this flag when restoring a minimized window.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOW 5</term>
	/// <term>Activates the window and displays it in its current size and position.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWDEFAULT 10</term>
	/// <term>
	/// Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the
	/// program that started the application.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMAXIMIZED 3</term>
	/// <term>Activates the window and displays it as a maximized window.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMINIMIZED 2</term>
	/// <term>Activates the window and displays it as a minimized window.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWMINNOACTIVE 7</term>
	/// <term>Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.</term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNA 8</term>
	/// <term>
	/// Displays the window in its current size and position. This value is similar to SW_SHOW, except that the window is not activated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNOACTIVATE 4</term>
	/// <term>
	/// Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except that the window is not activated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>SW_SHOWNORMAL 1</term>
	/// <term>
	/// Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and
	/// position. An application should specify this flag when displaying the window for the first time.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the window was previously visible, the return value is nonzero.</para>
	/// <para>If the window was previously hidden, the return value is zero.</para>
	/// </returns>
	/// <remarks>
	/// <para>To perform certain special effects when showing or hiding a window, use AnimateWindow.</para>
	/// <para>
	/// The first time an application calls <c>ShowWindow</c>, it should use the WinMain function's nCmdShow parameter as its nCmdShow
	/// parameter. Subsequent calls to <c>ShowWindow</c> must use one of the values in the given list, instead of the one specified by
	/// the <c>WinMain</c> function's nCmdShow parameter.
	/// </para>
	/// <para>
	/// As noted in the discussion of the nCmdShow parameter, the nCmdShow value is ignored in the first call to <c>ShowWindow</c> if the
	/// program that launched the application specifies startup information in the structure. In this case, <c>ShowWindow</c> uses the
	/// information specified in the STARTUPINFO structure to show the window. On subsequent calls, the application must call
	/// <c>ShowWindow</c> with nCmdShow set to <c>SW_SHOWDEFAULT</c> to use the startup information provided by the program that launched
	/// the application. This behavior is designed for the following situations:
	/// </para>
	/// <list type="bullet">
	/// <item>
	/// <term>Applications create their main window by calling CreateWindow with the <c>WS_VISIBLE</c> flag set.</term>
	/// </item>
	/// <item>
	/// <term>
	/// Applications create their main window by calling CreateWindow with the <c>WS_VISIBLE</c> flag cleared, and later call
	/// <c>ShowWindow</c> with the <c>SW_SHOW</c> flag set to make it visible.
	/// </term>
	/// </item>
	/// </list>
	/// <para>Examples</para>
	/// <para>For an example, see Creating a Main Window.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-showwindow BOOL ShowWindow( HWND hWnd, int nCmdShow );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "showwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ShowWindow(HWND hWnd, ShowWindowCommand nCmdShow);

	/// <summary>
	/// <para>Sets the show state of a window without waiting for the operation to complete.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="nCmdShow">
	/// <para>Type: <c>int</c></para>
	/// <para>Controls how the window is to be shown. For a list of possible values, see the description of the ShowWindow function.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the operation was successfully started, the return value is nonzero.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// This function posts a show-window event to the message queue of the given window. An application can use this function to avoid
	/// becoming nonresponsive while waiting for a nonresponsive application to finish processing a show-window event.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-showwindowasync BOOL ShowWindowAsync( HWND hWnd, int
	// nCmdShow );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "showwindowasync")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool ShowWindowAsync(HWND hWnd, ShowWindowCommand nCmdShow);

	/// <summary>
	/// <para>Triggers a visual signal to indicate that a sound is playing.</para>
	/// </summary>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>This function returns one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Return code</term>
	/// <term>Description</term>
	/// </listheader>
	/// <item>
	/// <term>TRUE</term>
	/// <term>The visual signal was or will be displayed correctly.</term>
	/// </item>
	/// <item>
	/// <term>FALSE</term>
	/// <term>An error prevented the signal from being displayed.</term>
	/// </item>
	/// </list>
	/// </returns>
	/// <remarks>
	/// <para>Set the notification behavior by calling SystemParametersInfo with the <c>SPI_SETSOUNDSENTRY</c> value.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-soundsentry BOOL SoundSentry( );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "soundsentry")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool SoundSentry();

	/// <summary>
	/// <para>[This function is not intended for general use. It may be altered or unavailable in subsequent versions of Windows.]</para>
	/// <para>Switches focus to the specified window and brings it to the foreground.</para>
	/// </summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window.</para>
	/// </param>
	/// <param name="fUnknown">
	/// <para>Type: <c>BOOL</c></para>
	/// <para>
	/// A <c>TRUE</c> for this parameter indicates that the window is being switched to using the Alt/Ctl+Tab key sequence. This
	/// parameter should be <c>FALSE</c> otherwise.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>This function does not return a value.</para>
	/// </returns>
	/// <remarks>
	/// <para>This function is typically called to maintain window z-ordering.</para>
	/// <para>
	/// This function was not included in the SDK headers and libraries until Windows XP with Service Pack 1 (SP1) and Windows Server
	/// 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-switchtothiswindow void SwitchToThisWindow( HWND hwnd,
	// BOOL fUnknown );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "switchtothiswindow")]
	public static extern void SwitchToThisWindow(HWND hwnd, [MarshalAs(UnmanagedType.Bool)] bool fUnknown);

	/// <summary>
	/// <para>Tiles the specified child windows of the specified parent window.</para>
	/// </summary>
	/// <param name="hwndParent">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the parent window. If this parameter is <c>NULL</c>, the desktop window is assumed.</para>
	/// </param>
	/// <param name="wHow">
	/// <para>Type: <c>UINT</c></para>
	/// <para>
	/// The tiling flags. This parameter can be one of the following values—optionally combined with <c>MDITILE_SKIPDISABLED</c> to
	/// prevent disabled MDI child windows from being tiled.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>MDITILE_HORIZONTAL 0x0001</term>
	/// <term>Tiles windows horizontally.</term>
	/// </item>
	/// <item>
	/// <term>MDITILE_VERTICAL 0x0000</term>
	/// <term>Tiles windows vertically.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="lpRect">
	/// <para>Type: <c>const RECT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the rectangular area, in client coordinates, within which the windows are arranged. If
	/// this parameter is <c>NULL</c>, the client area of the parent window is used.
	/// </para>
	/// </param>
	/// <param name="cKids">
	/// <para>Type: <c>UINT</c></para>
	/// <para>The number of elements in the array specified by the lpKids parameter. This parameter is ignored if lpKids is <c>NULL</c>.</para>
	/// </param>
	/// <param name="lpKids">
	/// <para>Type: <c>const HWND*</c></para>
	/// <para>
	/// An array of handles to the child windows to arrange. If a specified child window is a top-level window with the style
	/// <c>WS_EX_TOPMOST</c> or <c>WS_EX_TOOLWINDOW</c>, the child window is not arranged. If this parameter is <c>NULL</c>, all child
	/// windows of the specified parent window (or of the desktop window) are arranged.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>WORD</c></c></para>
	/// <para>If the function succeeds, the return value is the number of windows arranged.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>Calling <c>TileWindows</c> causes all maximized windows to be restored to their previous size.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-tilewindows WORD TileWindows( HWND hwndParent, UINT wHow,
	// CONST RECT *lpRect, UINT cKids, const HWND *lpKids );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "tilewindows")]
	public static extern ushort TileWindows([Optional] HWND hwndParent, MdiTileFlags wHow, [Optional] PRECT? lpRect, uint cKids, [In, Optional] HWND[]? lpKids);

	/// <summary>
	/// Processes accelerator keystrokes for window menu commands of the multiple-document interface (MDI) child windows associated with
	/// the specified MDI client window. The function translates WM_KEYUP and WM_KEYDOWN messages to WM_SYSCOMMAND messages and sends
	/// them to the appropriate MDI child windows.
	/// </summary>
	/// <param name="hWndClient">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the MDI client window.</para>
	/// </param>
	/// <param name="lpMsg">
	/// <para>Type: <c>LPMSG</c></para>
	/// <para>
	/// A pointer to a message retrieved by using the GetMessage or PeekMessage function. The message must be an MSG structure and
	/// contain message information from the application's message queue.
	/// </para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the message is translated into a system command, the return value is nonzero.</para>
	/// <para>If the message is not translated into a system command, the return value is zero.</para>
	/// </returns>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-translatemdisysaccel BOOL TranslateMDISysAccel( HWND
	// hWndClient, LPMSG lpMsg );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool TranslateMDISysAccel(HWND hWndClient, ref MSG lpMsg);

	/// <summary>Unregisters a window class, freeing the memory required for the class.</summary>
	/// <param name="lpClassName">
	/// <para>Type: <c>LPCTSTR</c></para>
	/// <para>
	/// A null-terminated string or a class atom. If lpClassName is a string, it specifies the window class name. This class name must
	/// have been registered by a previous call to the RegisterClass or RegisterClassEx function. System classes, such as dialog box
	/// controls, cannot be unregistered. If this parameter is an atom, it must be a class atom created by a previous call to the
	/// <c>RegisterClass</c> or <c>RegisterClassEx</c> function. The atom must be in the low-order word of lpClassName; the high-order
	/// word must be zero.
	/// </para>
	/// </param>
	/// <param name="hInstance">
	/// <para>Type: <c>HINSTANCE</c></para>
	/// <para>A handle to the instance of the module that created the class.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>
	/// If the class could not be found or if a window still exists that was created with the class, the return value is zero. To get
	/// extended error information, call GetLastError.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>Before calling this function, an application must destroy all windows created with the specified class.</para>
	/// <para>All window classes that an application registers are unregistered when it terminates.</para>
	/// <para>Class atoms are special atoms returned only by RegisterClass and RegisterClassEx.</para>
	/// <para>No window classes registered by a DLL are unregistered when the .dll is unloaded.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-unregisterclassa BOOL UnregisterClassA( LPCSTR
	// lpClassName, HINSTANCE hInstance );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool UnregisterClass(string lpClassName, HINSTANCE hInstance);

	/// <summary>
	/// <para>Updates the position, size, shape, content, and translucency of a layered window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to a layered window. A layered window is created by specifying <c>WS_EX_LAYERED</c> when creating the window with the
	/// CreateWindowEx function.
	/// </para>
	/// <para>
	/// <c>Windows 8:</c> The <c>WS_EX_LAYERED</c> style is supported for top-level windows and child windows. Previous Windows versions
	/// support <c>WS_EX_LAYERED</c> only for top-level windows.
	/// </para>
	/// </param>
	/// <param name="hdcDst">
	/// <para>Type: <c>HDC</c></para>
	/// <para>
	/// A handle to a DC for the screen. This handle is obtained by specifying <c>NULL</c> when calling the function. It is used for
	/// palette color matching when the window contents are updated. If hdcDst is <c>NULL</c>, the default palette will be used.
	/// </para>
	/// <para>If hdcSrc is <c>NULL</c>, hdcDst must be <c>NULL</c>.</para>
	/// </param>
	/// <param name="pptDst">
	/// <para>Type: <c>POINT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the new screen position of the layered window. If the current position is not changing,
	/// pptDst can be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="psize">
	/// <para>Type: <c>SIZE*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the new size of the layered window. If the size of the window is not changing, psize can
	/// be <c>NULL</c>. If hdcSrc is <c>NULL</c>, psize must be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="hdcSrc">
	/// <para>Type: <c>HDC</c></para>
	/// <para>
	/// A handle to a DC for the surface that defines the layered window. This handle can be obtained by calling the CreateCompatibleDC
	/// function. If the shape and visual context of the window are not changing, hdcSrc can be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="pptSrc">
	/// <para>Type: <c>POINT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the location of the layer in the device context. If hdcSrc is <c>NULL</c>, pptSrc should
	/// be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="crKey">
	/// <para>Type: <c>COLORREF</c></para>
	/// <para>
	/// A structure that specifies the color key to be used when composing the layered window. To generate a COLORREF, use the RGB macro.
	/// </para>
	/// </param>
	/// <param name="pblend">
	/// <para>Type: <c>BLENDFUNCTION*</c></para>
	/// <para>A pointer to a structure that specifies the transparency value to be used when composing the layered window.</para>
	/// </param>
	/// <param name="dwFlags">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>This parameter can be one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>ULW_ALPHA 0x00000002</term>
	/// <term>
	/// Use pblend as the blend function. If the display mode is 256 colors or less, the effect of this value is the same as the effect
	/// of ULW_OPAQUE.
	/// </term>
	/// </item>
	/// <item>
	/// <term>ULW_COLORKEY 0x00000001</term>
	/// <term>Use crKey as the transparency color.</term>
	/// </item>
	/// <item>
	/// <term>ULW_OPAQUE 0x00000004</term>
	/// <term>Draw an opaque layered window.</term>
	/// </item>
	/// </list>
	/// <para>If hdcSrc is <c>NULL</c>, dwFlags should be zero.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The source DC should contain the surface that defines the visible contents of the layered window. For example, you can select a
	/// bitmap into a device context obtained by calling the CreateCompatibleDC function.
	/// </para>
	/// <para>
	/// An application should call SetLayout on the hdcSrc device context to properly set the mirroring mode. <c>SetLayout</c> will
	/// properly mirror all drawing into an <c>HDC</c> while properly preserving text glyph and (optionally) bitmap direction order. It
	/// cannot modify drawing directly into the bits of a device-independent bitmap (DIB). For more information, see Window Layout and Mirroring.
	/// </para>
	/// <para>
	/// The <c>UpdateLayeredWindow</c> function maintains the window's appearance on the screen. The windows underneath a layered window
	/// do not need to be repainted when they are uncovered due to a call to <c>UpdateLayeredWindow</c>, because the system will
	/// automatically repaint them. This permits seamless animation of the layered window.
	/// </para>
	/// <para>
	/// <c>UpdateLayeredWindow</c> always updates the entire window. To update part of a window, use the traditional WM_PAINT and set the
	/// blend value using SetLayeredWindowAttributes.
	/// </para>
	/// <para>
	/// For best drawing performance by the layered window and any underlying windows, the layered window should be as small as possible.
	/// An application should also process the message and re-create its layered windows when the display's color depth changes.
	/// </para>
	/// <para>For more information, see Layered Windows.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-updatelayeredwindow BOOL UpdateLayeredWindow( HWND hWnd,
	// HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "updatelayeredwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool UpdateLayeredWindow(HWND hWnd, HDC hdcDst, in POINT pptDst, in SIZE psize, HDC hdcSrc,
		in POINT pptSrc, COLORREF crKey, in Gdi32.BLENDFUNCTION pblend, UpdateLayeredWindowFlags dwFlags);

	/// <summary>
	/// <para>Updates the position, size, shape, content, and translucency of a layered window.</para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to a layered window. A layered window is created by specifying <c>WS_EX_LAYERED</c> when creating the window with the
	/// CreateWindowEx function.
	/// </para>
	/// <para>
	/// <c>Windows 8:</c> The <c>WS_EX_LAYERED</c> style is supported for top-level windows and child windows. Previous Windows versions
	/// support <c>WS_EX_LAYERED</c> only for top-level windows.
	/// </para>
	/// </param>
	/// <param name="hdcDst">
	/// <para>Type: <c>HDC</c></para>
	/// <para>
	/// A handle to a DC for the screen. This handle is obtained by specifying <c>NULL</c> when calling the function. It is used for
	/// palette color matching when the window contents are updated. If hdcDst is <c>NULL</c>, the default palette will be used.
	/// </para>
	/// <para>If hdcSrc is <c>NULL</c>, hdcDst must be <c>NULL</c>.</para>
	/// </param>
	/// <param name="pptDst">
	/// <para>Type: <c>POINT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the new screen position of the layered window. If the current position is not changing,
	/// pptDst can be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="psize">
	/// <para>Type: <c>SIZE*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the new size of the layered window. If the size of the window is not changing, psize can
	/// be <c>NULL</c>. If hdcSrc is <c>NULL</c>, psize must be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="hdcSrc">
	/// <para>Type: <c>HDC</c></para>
	/// <para>
	/// A handle to a DC for the surface that defines the layered window. This handle can be obtained by calling the CreateCompatibleDC
	/// function. If the shape and visual context of the window are not changing, hdcSrc can be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="pptSrc">
	/// <para>Type: <c>POINT*</c></para>
	/// <para>
	/// A pointer to a structure that specifies the location of the layer in the device context. If hdcSrc is <c>NULL</c>, pptSrc should
	/// be <c>NULL</c>.
	/// </para>
	/// </param>
	/// <param name="crKey">
	/// <para>Type: <c>COLORREF</c></para>
	/// <para>
	/// A structure that specifies the color key to be used when composing the layered window. To generate a COLORREF, use the RGB macro.
	/// </para>
	/// </param>
	/// <param name="pblend">
	/// <para>Type: <c>BLENDFUNCTION*</c></para>
	/// <para>A pointer to a structure that specifies the transparency value to be used when composing the layered window.</para>
	/// </param>
	/// <param name="dwFlags">
	/// <para>Type: <c>DWORD</c></para>
	/// <para>This parameter can be one of the following values.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>ULW_ALPHA 0x00000002</term>
	/// <term>
	/// Use pblend as the blend function. If the display mode is 256 colors or less, the effect of this value is the same as the effect
	/// of ULW_OPAQUE.
	/// </term>
	/// </item>
	/// <item>
	/// <term>ULW_COLORKEY 0x00000001</term>
	/// <term>Use crKey as the transparency color.</term>
	/// </item>
	/// <item>
	/// <term>ULW_OPAQUE 0x00000004</term>
	/// <term>Draw an opaque layered window.</term>
	/// </item>
	/// </list>
	/// <para>If hdcSrc is <c>NULL</c>, dwFlags should be zero.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>BOOL</c></c></para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The source DC should contain the surface that defines the visible contents of the layered window. For example, you can select a
	/// bitmap into a device context obtained by calling the CreateCompatibleDC function.
	/// </para>
	/// <para>
	/// An application should call SetLayout on the hdcSrc device context to properly set the mirroring mode. <c>SetLayout</c> will
	/// properly mirror all drawing into an <c>HDC</c> while properly preserving text glyph and (optionally) bitmap direction order. It
	/// cannot modify drawing directly into the bits of a device-independent bitmap (DIB). For more information, see Window Layout and Mirroring.
	/// </para>
	/// <para>
	/// The <c>UpdateLayeredWindow</c> function maintains the window's appearance on the screen. The windows underneath a layered window
	/// do not need to be repainted when they are uncovered due to a call to <c>UpdateLayeredWindow</c>, because the system will
	/// automatically repaint them. This permits seamless animation of the layered window.
	/// </para>
	/// <para>
	/// <c>UpdateLayeredWindow</c> always updates the entire window. To update part of a window, use the traditional WM_PAINT and set the
	/// blend value using SetLayeredWindowAttributes.
	/// </para>
	/// <para>
	/// For best drawing performance by the layered window and any underlying windows, the layered window should be as small as possible.
	/// An application should also process the message and re-create its layered windows when the display's color depth changes.
	/// </para>
	/// <para>For more information, see Layered Windows.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-updatelayeredwindow BOOL UpdateLayeredWindow( HWND hWnd,
	// HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags );
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "updatelayeredwindow")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool UpdateLayeredWindow(HWND hWnd, [In, Optional] HDC hdcDst, [In, Optional] IntPtr pptDst, [In, Optional] IntPtr psize,
		[In, Optional] HDC hdcSrc, [In, Optional] IntPtr pptSrc, COLORREF crKey, in Gdi32.BLENDFUNCTION pblend, UpdateLayeredWindowFlags dwFlags);

	/// <summary>Updates the position, size, shape, content, and translucency of a layered window.</summary>
	/// <param name="hwnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>
	/// A handle to a layered window. A layered window is created by specifying <c>WS_EX_LAYERED</c> when creating the window with the
	/// <c>CreateWindowEx</c> function.
	/// </para>
	/// <para>
	/// <c>Windows 8:</c> The <c>WS_EX_LAYERED</c> style is supported for top-level windows and child windows. Previous Windows versions
	/// support <c>WS_EX_LAYERED</c> only for top-level windows.
	/// </para>
	/// </param>
	/// <param name="pULWInfo">
	/// <para>Type: <c>const <c>UPDATELAYEREDWINDOWINFO</c>*</c></para>
	/// <para>A pointer to a structure that contains the information for the window.</para>
	/// </param>
	/// <returns>
	/// <para>Type:</para>
	/// <para>If the function succeeds, the return value is nonzero.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call <c>GetLastError</c>.</para>
	/// </returns>
	// BOOL WINAPI UpdateLayeredWindowIndirect( _In_ HWND hwnd, _In_ const UPDATELAYEREDWINDOWINFO *pULWInfo); https://msdn.microsoft.com/en-us/library/windows/desktop/ms633557(v=vs.85).aspx
	[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
	[PInvokeData("Winuser.h", MSDNShortId = "ms633557")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool UpdateLayeredWindowIndirect([In] HWND hwnd, in UPDATELAYEREDWINDOWINFO pULWInfo);

	/// <summary>
	/// <para>Retrieves a handle to the window that contains the specified physical point.</para>
	/// </summary>
	/// <param name="Point">
	/// <para>Type: <c>POINT</c></para>
	/// <para>The physical coordinates of the point.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>A handle to the window that contains the given physical point. If no window exists at the point, this value is <c>NULL</c>.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>WindowFromPhysicalPoint</c> function does not retrieve a handle to a hidden or disabled window, even if the point is
	/// within the window.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-windowfromphysicalpoint HWND WindowFromPhysicalPoint(
	// POINT Point );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "windowfromphysicalpoint")]
	public static extern HWND WindowFromPhysicalPoint(POINT Point);

	/// <summary>
	/// <para>Retrieves a handle to the window that contains the specified point.</para>
	/// </summary>
	/// <param name="Point">
	/// <para>Type: <c>POINT</c></para>
	/// <para>The point to be checked.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>HWND</c></c></para>
	/// <para>
	/// The return value is a handle to the window that contains the point. If no window exists at the given point, the return value is
	/// <c>NULL</c>. If the point is over a static text control, the return value is a handle to the window under the static text control.
	/// </para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// The <c>WindowFromPoint</c> function does not retrieve a handle to a hidden or disabled window, even if the point is within the
	/// window. An application should use the ChildWindowFromPoint function for a nonrestrictive search.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see "Interface from Running Object Table" in About Text Object Model.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-windowfrompoint HWND WindowFromPoint( POINT Point );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winuser.h", MSDNShortId = "windowfrompoint")]
	public static extern HWND WindowFromPoint(POINT Point);

	/// <summary>
	/// <para>
	/// Temporarily enables or disables an Input Method Editor (IME) and, at the same time, turns on or off the display of all windows
	/// owned by the IME.
	/// </para>
	/// <para><c>Note</c> This function is obsolete and should not be used.</para>
	/// </summary>
	/// <param name="hWnd">Must be <c>NULL</c>. Specifying a particular IME for each application is not supported.</param>
	/// <param name="fEnable"><c>TRUE</c> to enable the IME; <c>FALSE</c> to disable.</param>
	/// <returns>The previous state of the IME. <c>TRUE</c> if it was enabled before this call, otherwise, <c>FALSE</c>.</returns>
	/// <remarks>
	/// <para>The terms "enabled" and "disabled" in regard to this function are defined as follows:</para>
	/// <para>
	/// If an IME is disabled, IME_WINDOWUPDATE(FALSE) is issued to the IME, which responds by deleting the conversion and system
	/// windows. With the IME disabled, keyboard messages are not sent to the IME, but are sent directly to the application. Even if the
	/// IME is disabled, the API that uses the SendIMEMessageEx function is still valid.
	/// </para>
	/// <para>
	/// If an IME is enabled, IME_WINDOWUPDATE(TRUE) is issued to the IME, which responds by redisplaying the conversion and system
	/// windows. With the IME enabled, keyboard messages are sent to the IME.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winnls32/nf-winnls32-winnlsenableime BOOL WINNLSEnableIME( IN HWND, IN BOOL );
	[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
	[PInvokeData("winnls32.h", MSDNShortId = "")]
	[return: MarshalAs(UnmanagedType.Bool)]
	public static extern bool WINNLSEnableIME([In, Optional] HWND hWnd, [In][MarshalAs(UnmanagedType.Bool)] bool fEnable);

	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[return: MarshalAs(UnmanagedType.Bool)]
	private static extern bool GetClassInfoEx([In] HINSTANCE hInstance, [MarshalAs(UnmanagedType.LPTStr)] string lpszClass, ref WNDCLASSEXB lpwcx);

	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[return: MarshalAs(UnmanagedType.Bool)]
	private static extern bool GetClassInfoEx([In] HINSTANCE hInstance, [In] IntPtr lpszClass, ref WNDCLASSEXB lpwcx);

	/// <summary>
	/// <para>Retrieves the specified 32-bit ( <c>DWORD</c>) value from the WNDCLASSEX structure associated with the specified window.</para>
	/// <para>
	/// <c>Note</c> If you are retrieving a pointer or a handle, this function has been superseded by the GetClassLongPtr function.
	/// (Pointers and handles are 32 bits on 32-bit Windows and 64 bits on 64-bit Windows.)
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be retrieved. To retrieve a value from the extra class memory, specify the positive, zero-based byte offset of the
	/// value to be retrieved. Valid values are in the range zero through the number of bytes of extra class memory, minus four; for
	/// example, if you specified 12 or more bytes of extra class memory, a value of 8 would be an index to the third integer. To
	/// retrieve any other value from the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCW_ATOM -32</term>
	/// <term>
	/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClassEx function returns.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>Retrieves the size, in bytes, of the extra memory associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Retrieves the size, in bytes, of the extra window memory associated with each window in the class. For information on how to
	/// access this memory, see GetWindowLong.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_HBRBACKGROUND -10</term>
	/// <term>Retrieves a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HCURSOR -12</term>
	/// <term>Retrieves a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HICON -14</term>
	/// <term>Retrieves a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HMODULE -16</term>
	/// <term>Retrieves a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_MENUNAME -8</term>
	/// <term>Retrieves the address of the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Retrieves the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCL_WNDPROC -24</term>
	/// <term>
	/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
	/// CallWindowProc function to call the window procedure.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>DWORD</c></c></para>
	/// <para>If the function succeeds, the return value is the requested value.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclasslonga DWORD GetClassLongA( HWND hWnd, int nIndex );
	[DllImport(Lib.User32, SetLastError = true, EntryPoint = "GetClassLong", CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	private static extern int GetClassLong32(HWND hWnd, int nIndex);

	/// <summary>
	/// <para>Retrieves the specified value from the WNDCLASSEX structure associated with the specified window.</para>
	/// <para>
	/// <c>Note</c> To write code that is compatible with both 32-bit and 64-bit versions of Windows, use <c>GetClassLongPtr</c>. When
	/// compiling for 32-bit Windows, <c>GetClassLongPtr</c> is defined as a call to the GetClassLong function.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be retrieved. To retrieve a value from the extra class memory, specify the positive, zero-based byte offset of the
	/// value to be retrieved. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for
	/// example, if you specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To
	/// retrieve any other value from the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCW_ATOM -32</term>
	/// <term>
	/// Retrieves an ATOM value that uniquely identifies the window class. This is the same atom that the RegisterClassEx function returns.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>Retrieves the size, in bytes, of the extra memory associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Retrieves the size, in bytes, of the extra window memory associated with each window in the class. For information on how to
	/// access this memory, see GetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_HBRBACKGROUND -10</term>
	/// <term>Retrieves a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Retrieves a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Retrieves a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Retrieves a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Retrieves the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Retrieves the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>
	/// Retrieves the address of the window procedure, or a handle representing the address of the window procedure. You must use the
	/// CallWindowProc function to call the window procedure.
	/// </term>
	/// </item>
	/// </list>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>If the function succeeds, the return value is the requested value.</para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclasslongptra ULONG_PTR GetClassLongPtrA( HWND hWnd,
	// int nIndex );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	private static extern IntPtr GetClassLongPtr(HWND hWnd, int nIndex);

	/// <summary>
	/// <para>
	/// Replaces the specified 32-bit ( <c>long</c>) value at the specified offset into the extra class memory or the WNDCLASSEX
	/// structure for the class to which the specified window belongs.
	/// </para>
	/// <para>
	/// <c>Note</c> This function has been superseded by the SetClassLongPtr function. To write code that is compatible with both 32-bit
	/// and 64-bit versions of Windows, use <c>SetClassLongPtr</c>.
	/// </para>
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be replaced. To set a 32-bit value in the extra class memory, specify the positive, zero-based byte offset of the
	/// value to be set. Valid values are in the range zero through the number of bytes of extra class memory, minus four; for example,
	/// if you specified 12 or more bytes of extra class memory, a value of 8 would be an index to the third 32-bit integer. To set any
	/// other value from the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>
	/// Sets the size, in bytes, of the extra memory associated with the class. Setting this value does not change the number of extra
	/// bytes already allocated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Sets the size, in bytes, of the extra window memory associated with each window in the class. Setting this value does not change
	/// the number of extra bytes already allocated. For information on how to access this memory, see SetWindowLong.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_HBRBACKGROUND -10</term>
	/// <term>Replaces a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HCURSOR -12</term>
	/// <term>Replaces a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HICON -14</term>
	/// <term>Replaces a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HICONSM -34</term>
	/// <term>Replace a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_HMODULE -16</term>
	/// <term>Replaces a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_MENUNAME -8</term>
	/// <term>Replaces the address of the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Replaces the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCL_WNDPROC -24</term>
	/// <term>Replaces the address of the window procedure associated with the class.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="dwNewLong">
	/// <para>Type: <c>LONG</c></para>
	/// <para>The replacement value.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>DWORD</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the previous value of the specified 32-bit integer. If the value was not previously
	/// set, the return value is zero.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you use the <c>SetClassLong</c> function and the <c>GCL_WNDPROC</c> index to replace the window procedure, the window
	/// procedure must conform to the guidelines specified in the description of the WindowProc callback function.
	/// </para>
	/// <para>
	/// Calling <c>SetClassLong</c> with the <c>GCL_WNDPROC</c> index creates a subclass of the window class that affects all windows
	/// subsequently created with the class. An application can subclass a system class, but should not subclass a window class created
	/// by another process.
	/// </para>
	/// <para>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </para>
	/// <para>
	/// Use the <c>SetClassLong</c> function with care. For example, it is possible to change the background color for a class by using
	/// <c>SetClassLong</c>, but this change does not immediately repaint all windows belonging to the class.
	/// </para>
	/// <para>Examples</para>
	/// <para>For an example, see Displaying an Icon.</para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclasslonga DWORD SetClassLongA( HWND hWnd, int nIndex,
	// LONG dwNewLong );
	[DllImport(Lib.User32, SetLastError = true, EntryPoint = "SetClassLong", CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	private static extern uint SetClassLong32(HWND hWnd, int nIndex, int dwNewLong);

	/// <summary>
	/// Replaces the specified value at the specified offset in the extra class memory or the WNDCLASSEX structure for the class to which
	/// the specified window belongs.
	/// </summary>
	/// <param name="hWnd">
	/// <para>Type: <c>HWND</c></para>
	/// <para>A handle to the window and, indirectly, the class to which the window belongs.</para>
	/// </param>
	/// <param name="nIndex">
	/// <para>Type: <c>int</c></para>
	/// <para>
	/// The value to be replaced. To set a value in the extra class memory, specify the positive, zero-based byte offset of the value to
	/// be set. Valid values are in the range zero through the number of bytes of extra class memory, minus eight; for example, if you
	/// specified 24 or more bytes of extra class memory, a value of 16 would be an index to the third integer. To set a value other than
	/// the WNDCLASSEX structure, specify one of the following values.
	/// </para>
	/// <list type="table">
	/// <listheader>
	/// <term>Value</term>
	/// <term>Meaning</term>
	/// </listheader>
	/// <item>
	/// <term>GCL_CBCLSEXTRA -20</term>
	/// <term>
	/// Sets the size, in bytes, of the extra memory associated with the class. Setting this value does not change the number of extra
	/// bytes already allocated.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCL_CBWNDEXTRA -18</term>
	/// <term>
	/// Sets the size, in bytes, of the extra window memory associated with each window in the class. Setting this value does not change
	/// the number of extra bytes already allocated. For information on how to access this memory, see SetWindowLongPtr.
	/// </term>
	/// </item>
	/// <item>
	/// <term>GCLP_ HBRBACKGROUND -10</term>
	/// <term>Replaces a handle to the background brush associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HCURSOR -12</term>
	/// <term>Replaces a handle to the cursor associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICON -14</term>
	/// <term>Replaces a handle to the icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HICONSM -34</term>
	/// <term>Retrieves a handle to the small icon associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_HMODULE -16</term>
	/// <term>Replaces a handle to the module that registered the class.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_MENUNAME -8</term>
	/// <term>Replaces the pointer to the menu name string. The string identifies the menu resource associated with the class.</term>
	/// </item>
	/// <item>
	/// <term>GCL_STYLE -26</term>
	/// <term>Replaces the window-class style bits.</term>
	/// </item>
	/// <item>
	/// <term>GCLP_WNDPROC -24</term>
	/// <term>Replaces the pointer to the window procedure associated with the class.</term>
	/// </item>
	/// </list>
	/// </param>
	/// <param name="dwNewLong">
	/// <para>Type: <c>LONG_PTR</c></para>
	/// <para>The replacement value.</para>
	/// </param>
	/// <returns>
	/// <para>Type: <c>Type: <c>ULONG_PTR</c></c></para>
	/// <para>
	/// If the function succeeds, the return value is the previous value of the specified offset. If this was not previously set, the
	/// return value is zero.
	/// </para>
	/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
	/// </returns>
	/// <remarks>
	/// <para>
	/// If you use the <c>SetClassLongPtr</c> function and the <c>GCLP_WNDPROC</c> index to replace the window procedure, the window
	/// procedure must conform to the guidelines specified in the description of the WindowProc callback function.
	/// </para>
	/// <para>
	/// Calling <c>SetClassLongPtr</c> with the <c>GCLP_WNDPROC</c> index creates a subclass of the window class that affects all windows
	/// subsequently created with the class. An application can subclass a system class, but should not subclass a window class created
	/// by another process.
	/// </para>
	/// <para>
	/// Reserve extra class memory by specifying a nonzero value in the <c>cbClsExtra</c> member of the WNDCLASSEX structure used with
	/// the RegisterClassEx function.
	/// </para>
	/// <para>
	/// Use the <c>SetClassLongPtr</c> function with care. For example, it is possible to change the background color for a class by
	/// using <c>SetClassLongPtr</c>, but this change does not immediately repaint all windows belonging to the class.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclasslongptra ULONG_PTR SetClassLongPtrA( HWND hWnd,
	// int nIndex, LONG_PTR dwNewLong );
	[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
	[PInvokeData("winuser.h", MSDNShortId = "")]
	private static extern IntPtr SetClassLongPtr(HWND hWnd, int nIndex, IntPtr dwNewLong);

	/// <summary>
	/// <para>Contains status information for the application-switching (ALT+TAB) window.</para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagalttabinfo typedef struct tagALTTABINFO { DWORD cbSize;
	// int cItems; int cColumns; int cRows; int iColFocus; int iRowFocus; int cxItem; int cyItem; POINT ptStart; } ALTTABINFO,
	// *PALTTABINFO, *LPALTTABINFO;
	[PInvokeData("winuser.h", MSDNShortId = "alttabinfo")]
	[StructLayout(LayoutKind.Sequential)]
	public struct ALTTABINFO
	{
		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The size, in bytes, of the structure. The caller must set this to .</para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The number of items in the window.</para>
		/// </summary>
		public int cItems;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The number of columns in the window.</para>
		/// </summary>
		public int cColumns;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The number of rows in the window.</para>
		/// </summary>
		public int cRows;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The column of the item that has the focus.</para>
		/// </summary>
		public int iColFocus;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The row of the item that has the focus.</para>
		/// </summary>
		public int iRowFocus;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The width of each icon in the application-switching window.</para>
		/// </summary>
		public int cxItem;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The height of each icon in the application-switching window.</para>
		/// </summary>
		public int cyItem;

		/// <summary>
		/// <para>Type: <c>POINT</c></para>
		/// <para>The top-left corner of the first icon.</para>
		/// </summary>
		public POINT ptStart;
	}

	/// <summary>
	/// <para>Contains extended result information obtained by calling the ChangeWindowMessageFilterEx function.</para>
	/// </summary>
	/// <remarks>
	/// <para>
	/// Certain messages whose value is smaller than <c>WM_USER</c> are required to pass through the filter, regardless of the filter
	/// setting. There will be no effect when you attempt to use this function to allow or block such messages.
	/// </para>
	/// <para>
	/// An application may use the ChangeWindowMessageFilter function to allow or block a message in a process-wide manner. If the
	/// message is allowed by either the process message filter or the window message filter, it will be delivered to the window.
	/// </para>
	/// <para>The following table lists the possible values returned in <c>ExtStatus</c>.</para>
	/// <list type="table">
	/// <listheader>
	/// <term>Message already allowed at higher scope</term>
	/// <term>Message already allowed by window's message filter</term>
	/// <term>Operation requested</term>
	/// <term>Indicator returned in ExtStatus on success</term>
	/// </listheader>
	/// <item>
	/// <term>No</term>
	/// <term>No</term>
	/// <term>MSGFLT_ALLOW</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>No</term>
	/// <term>No</term>
	/// <term>MSGFLT_DISALLOW</term>
	/// <term>MSGFLTINFO_ALREADYDISALLOWED_FORWND</term>
	/// </item>
	/// <item>
	/// <term>No</term>
	/// <term>No</term>
	/// <term>MSGFLT_RESET</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>No</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_ALLOW</term>
	/// <term>MSGFLTINFO_ALREADYALLOWED_FORWND</term>
	/// </item>
	/// <item>
	/// <term>No</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_DISALLOW</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>No</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_RESET</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>No</term>
	/// <term>MSGFLT_ALLOW</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>No</term>
	/// <term>MSGFLT_DISALLOW</term>
	/// <term>MSGFLTINFO_ALLOWED_HIGHER</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>No</term>
	/// <term>MSGFLT_RESET</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_ALLOW</term>
	/// <term>MSGFLTINFO_ALREADYALLOWED_FORWND</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_DISALLOW</term>
	/// <term>MSGFLTINFO_ALLOWED_HIGHER</term>
	/// </item>
	/// <item>
	/// <term>Yes</term>
	/// <term>Yes</term>
	/// <term>MSGFLT_RESET</term>
	/// <term>MSGFLTINFO_NONE</term>
	/// </item>
	/// </list>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagchangefilterstruct typedef struct tagCHANGEFILTERSTRUCT
	// { DWORD cbSize; DWORD ExtStatus; } CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;
	[PInvokeData("winuser.h", MSDNShortId = "changefilterstruct")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct CHANGEFILTERSTRUCT
	{
		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The size of the structure, in bytes. Must be set to , otherwise the function fails with <c>ERROR_INVALID_PARAMETER</c>.</para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>If the function succeeds, this field contains one of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>MSGFLTINFO_NONE 0</term>
		/// <term>See the Remarks section. Applies to MSGFLT_ALLOW and MSGFLT_DISALLOW.</term>
		/// </item>
		/// <item>
		/// <term>MSGFLTINFO_ALLOWED_HIGHER 3</term>
		/// <term>The message is allowed at a scope higher than the window. Applies to MSGFLT_DISALLOW.</term>
		/// </item>
		/// <item>
		/// <term>MSGFLTINFO_ALREADYALLOWED_FORWND 1</term>
		/// <term>
		/// The message has already been allowed by this window's message filter, and the function thus succeeded with no change to the
		/// window's message filter. Applies to MSGFLT_ALLOW.
		/// </term>
		/// </item>
		/// <item>
		/// <term>MSGFLTINFO_ALREADYDISALLOWED_FORWND 2</term>
		/// <term>
		/// The message has already been blocked by this window's message filter, and the function thus succeeded with no change to the
		/// window's message filter. Applies to MSGFLT_DISALLOW.
		/// </term>
		/// </item>
		/// </list>
		/// </summary>
		public MessageFilterInformation ExtStatus;

		/// <summary>The default value for this structure with the size field set appropriately.</summary>
		public static CHANGEFILTERSTRUCT Default = new() { cbSize = (uint)Marshal.SizeOf(typeof(CHANGEFILTERSTRUCT)) };
	}

	/// <summary>
	/// Defines the initialization parameters passed to the window procedure of an application. These members are identical to the
	/// parameters of the CreateWindowEx function.
	/// </summary>
	/// <remarks>
	/// <para>
	/// Because the <c>lpszClass</c> member can contain a pointer to a local (and thus inaccessable) atom, do not obtain the class name
	/// by using this member. Use the GetClassName function instead.
	/// </para>
	/// <para>
	/// You should access the data represented by the <c>lpCreateParams</c> member using a pointer that has been declared using the
	/// <c>UNALIGNED</c> type, because the pointer may not be <c>DWORD</c> aligned. This is demonstrated in the following example:
	/// </para>
	/// <para>
	/// <code>typedef struct tagMyData { // Define creation data here. } MYDATA; typedef struct tagMyDlgData { SHORT cbExtra; MYDATA myData; } MYDLGDATA, UNALIGNED *PMYDLGDATA; PMYDLGDATA pMyDlgdata = (PMYDLGDATA) (((LPCREATESTRUCT) lParam)-&gt;lpCreateParams);</code>
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-createstructa typedef struct tagCREATESTRUCTA { LPVOID
	// lpCreateParams; HINSTANCE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCSTR lpszName;
	// LPCSTR lpszClass; DWORD dwExStyle; } CREATESTRUCTA, *LPCREATESTRUCTA;
	[PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagCREATESTRUCTA")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct CREATESTRUCT
	{
		/// <summary>
		/// <para>Type: <c>LPVOID</c></para>
		/// <para>
		/// Contains additional data which may be used to create the window. If the window is being created as a result of a call to the
		/// CreateWindow or CreateWindowEx function, this member contains the value of the lpParam parameter specified in the function call.
		/// </para>
		/// <para>
		/// If the window being created is a MDI client window, this member contains a pointer to a CLIENTCREATESTRUCT structure. If the
		/// window being created is a MDI child window, this member contains a pointer to an MDICREATESTRUCT structure.
		/// </para>
		/// <para>
		/// If the window is being created from a dialog template, this member is the address of a <c>SHORT</c> value that specifies the
		/// size, in bytes, of the window creation data. The value is immediately followed by the creation data. For more information,
		/// see the following Remarks section.
		/// </para>
		/// </summary>
		public IntPtr lpCreateParams;

		/// <summary>
		/// <para>Type: <c>HINSTANCE</c></para>
		/// <para>A handle to the module that owns the new window.</para>
		/// </summary>
		public HINSTANCE hInstance;

		/// <summary>
		/// <para>Type: <c>HMENU</c></para>
		/// <para>A handle to the menu to be used by the new window.</para>
		/// </summary>
		public HMENU hMenu;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>
		/// A handle to the parent window, if the window is a child window. If the window is owned, this member identifies the owner
		/// window. If the window is not a child or owned window, this member is <c>NULL</c>.
		/// </para>
		/// </summary>
		public HWND hwndParent;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The height of the new window, in pixels.</para>
		/// </summary>
		public int cy;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The width of the new window, in pixels.</para>
		/// </summary>
		public int cx;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The y-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative
		/// to the parent window. Otherwise, the coordinates are relative to the screen origin.
		/// </para>
		/// </summary>
		public int y;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The x-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative
		/// to the parent window. Otherwise, the coordinates are relative to the screen origin.
		/// </para>
		/// </summary>
		public int x;

		/// <summary>
		/// <para>Type: <c>LONG</c></para>
		/// <para>The style for the new window. For a list of possible values, see Window Styles.</para>
		/// </summary>
		public WindowStyles style;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>The name of the new window.</para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string lpszName;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>A pointer to a null-terminated string or an atom that specifies the class name of the new window.</para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string lpszClass;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The extended window style for the new window. For a list of possible values, see Extended Window Styles.</para>
		/// </summary>
		public WindowStylesEx dwExStyle;
	}

	/// <summary>
	/// Defines the initialization parameters passed to the window procedure of an application. These members are identical to the
	/// parameters of the CreateWindowEx function.
	/// </summary>
	/// <remarks>
	/// <para>
	/// Because the <c>lpszClass</c> member can contain a pointer to a local (and thus inaccessable) atom, do not obtain the class name
	/// by using this member. Use the GetClassName function instead.
	/// </para>
	/// <para>
	/// You should access the data represented by the <c>lpCreateParams</c> member using a pointer that has been declared using the
	/// <c>UNALIGNED</c> type, because the pointer may not be <c>DWORD</c> aligned. This is demonstrated in the following example:
	/// </para>
	/// <para>
	/// <code>typedef struct tagMyData { // Define creation data here. } MYDATA; typedef struct tagMyDlgData { SHORT cbExtra; MYDATA myData; } MYDLGDATA, UNALIGNED *PMYDLGDATA; PMYDLGDATA pMyDlgdata = (PMYDLGDATA) (((LPCREATESTRUCT) lParam)-&gt;lpCreateParams);</code>
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-createstructa typedef struct tagCREATESTRUCTA { LPVOID
	// lpCreateParams; HINSTANCE hInstance; HMENU hMenu; HWND hwndParent; int cy; int cx; int y; int x; LONG style; LPCSTR lpszName;
	// LPCSTR lpszClass; DWORD dwExStyle; } CREATESTRUCTA, *LPCREATESTRUCTA;
	[PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagCREATESTRUCTA")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	internal struct CREATESTRUCT_UNMGD
	{
		/// <summary>
		/// <para>Type: <c>LPVOID</c></para>
		/// <para>
		/// Contains additional data which may be used to create the window. If the window is being created as a result of a call to the
		/// CreateWindow or CreateWindowEx function, this member contains the value of the lpParam parameter specified in the function call.
		/// </para>
		/// <para>
		/// If the window being created is a MDI client window, this member contains a pointer to a CLIENTCREATESTRUCT structure. If the
		/// window being created is a MDI child window, this member contains a pointer to an MDICREATESTRUCT structure.
		/// </para>
		/// <para>
		/// If the window is being created from a dialog template, this member is the address of a <c>SHORT</c> value that specifies the
		/// size, in bytes, of the window creation data. The value is immediately followed by the creation data. For more information,
		/// see the following Remarks section.
		/// </para>
		/// </summary>
		public IntPtr lpCreateParams;

		/// <summary>
		/// <para>Type: <c>HINSTANCE</c></para>
		/// <para>A handle to the module that owns the new window.</para>
		/// </summary>
		public HINSTANCE hInstance;

		/// <summary>
		/// <para>Type: <c>HMENU</c></para>
		/// <para>A handle to the menu to be used by the new window.</para>
		/// </summary>
		public HMENU hMenu;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>
		/// A handle to the parent window, if the window is a child window. If the window is owned, this member identifies the owner
		/// window. If the window is not a child or owned window, this member is <c>NULL</c>.
		/// </para>
		/// </summary>
		public HWND hwndParent;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The height of the new window, in pixels.</para>
		/// </summary>
		public int cy;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The width of the new window, in pixels.</para>
		/// </summary>
		public int cx;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The y-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative
		/// to the parent window. Otherwise, the coordinates are relative to the screen origin.
		/// </para>
		/// </summary>
		public int y;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The x-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative
		/// to the parent window. Otherwise, the coordinates are relative to the screen origin.
		/// </para>
		/// </summary>
		public int x;

		/// <summary>
		/// <para>Type: <c>LONG</c></para>
		/// <para>The style for the new window. For a list of possible values, see Window Styles.</para>
		/// </summary>
		public WindowStyles style;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>The name of the new window.</para>
		/// </summary>
		public StrPtrAuto lpszName;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>A pointer to a null-terminated string or an atom that specifies the class name of the new window.</para>
		/// </summary>
		public StrPtrAuto lpszClass;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The extended window style for the new window. For a list of possible values, see Extended Window Styles.</para>
		/// </summary>
		public WindowStylesEx dwExStyle;
	}

	/// <summary>Contains the flash status for a window and the number of times the system should flash the window.</summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-flashwinfo typedef struct { UINT cbSize; HWND hwnd; DWORD
	// dwFlags; UINT uCount; DWORD dwTimeout; } FLASHWINFO, *PFLASHWINFO;
	[PInvokeData("winuser.h", MSDNShortId = "b16636bc-fa77-4eb9-9801-dc2cdf0556e5")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct FLASHWINFO
	{
		/// <summary>The size of the structure, in bytes.</summary>
		public uint cbSize;

		/// <summary>A handle to the window to be flashed. The window can be either opened or minimized.</summary>
		public HWND hwnd;

		/// <summary>
		/// <para>The flash status. This parameter can be one or more of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>FLASHW_ALL 0x00000003</term>
		/// <term>Flash both the window caption and taskbar button. This is equivalent to setting the FLASHW_CAPTION | FLASHW_TRAY flags.</term>
		/// </item>
		/// <item>
		/// <term>FLASHW_CAPTION 0x00000001</term>
		/// <term>Flash the window caption.</term>
		/// </item>
		/// <item>
		/// <term>FLASHW_STOP 0</term>
		/// <term>Stop flashing. The system restores the window to its original state.</term>
		/// </item>
		/// <item>
		/// <term>FLASHW_TIMER 0x00000004</term>
		/// <term>Flash continuously, until the FLASHW_STOP flag is set.</term>
		/// </item>
		/// <item>
		/// <term>FLASHW_TIMERNOFG 0x0000000C</term>
		/// <term>Flash continuously until the window comes to the foreground.</term>
		/// </item>
		/// <item>
		/// <term>FLASHW_TRAY 0x00000002</term>
		/// <term>Flash the taskbar button.</term>
		/// </item>
		/// </list>
		/// </summary>
		public FLASHW dwFlags;

		/// <summary>The number of times to flash the window.</summary>
		public uint uCount;

		/// <summary>
		/// The rate at which the window is to be flashed, in milliseconds. If <c>dwTimeout</c> is zero, the function uses the default
		/// cursor blink rate.
		/// </summary>
		public uint dwTimeout;
	}

	/// <summary>
	/// <para>Contains information about a GUI thread.</para>
	/// </summary>
	/// <remarks>
	/// <para>
	/// This structure is used with the GetGUIThreadInfo function to retrieve information about the active window or a specified GUI thread.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagguithreadinfo typedef struct tagGUITHREADINFO { DWORD
	// cbSize; DWORD flags; HWND hwndActive; HWND hwndFocus; HWND hwndCapture; HWND hwndMenuOwner; HWND hwndMoveSize; HWND hwndCaret;
	// RECT rcCaret; } GUITHREADINFO, *PGUITHREADINFO, *LPGUITHREADINFO;
	[PInvokeData("winuser.h", MSDNShortId = "guithreadinfo")]
	[StructLayout(LayoutKind.Sequential)]
	public struct GUITHREADINFO
	{
		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The size of this structure, in bytes. The caller must set this member to .</para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The thread state. This member can be one or more of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>GUI_CARETBLINKING 0x00000001</term>
		/// <term>The caret's blink state. This bit is set if the caret is visible.</term>
		/// </item>
		/// <item>
		/// <term>GUI_INMENUMODE 0x00000004</term>
		/// <term>The thread's menu state. This bit is set if the thread is in menu mode.</term>
		/// </item>
		/// <item>
		/// <term>GUI_INMOVESIZE 0x00000002</term>
		/// <term>The thread's move state. This bit is set if the thread is in a move or size loop.</term>
		/// </item>
		/// <item>
		/// <term>GUI_POPUPMENUMODE 0x00000010</term>
		/// <term>The thread's pop-up menu state. This bit is set if the thread has an active pop-up menu.</term>
		/// </item>
		/// <item>
		/// <term>GUI_SYSTEMMENUMODE 0x00000008</term>
		/// <term>The thread's system menu state. This bit is set if the thread is in a system menu mode.</term>
		/// </item>
		/// </list>
		/// </summary>
		public GUIThreadInfoFlags flags;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the active window within the thread.</para>
		/// </summary>
		public HWND hwndActive;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the window that has the keyboard focus.</para>
		/// </summary>
		public HWND hwndFocus;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the window that has captured the mouse.</para>
		/// </summary>
		public HWND hwndCapture;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the window that owns any active menus.</para>
		/// </summary>
		public HWND hwndMenuOwner;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the window in a move or size loop.</para>
		/// </summary>
		public HWND hwndMoveSize;

		/// <summary>
		/// <para>Type: <c>HWND</c></para>
		/// <para>A handle to the window that is displaying the caret.</para>
		/// </summary>
		public HWND hwndCaret;

		/// <summary>
		/// <para>Type: <c>RECT</c></para>
		/// <para>The caret's bounding rectangle, in client coordinates, relative to the window specified by the <c>hwndCaret</c> member.</para>
		/// </summary>
		public RECT rcCaret;
	}

	/// <summary>
	/// Contains information that an application can use while processing the <c>WM_NCCALCSIZE</c> message to calculate the size, position,
	/// and valid contents of the client area of a window.
	/// </summary>
	// https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-nccalcsize_params typedef struct tagNCCALCSIZE_PARAMS { RECT
	// rgrc[3]; PWINDOWPOS lppos; } NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
	[PInvokeData("winuser.h", MSDNShortId = "NS:winuser.tagNCCALCSIZE_PARAMS")]
	[StructLayout(LayoutKind.Sequential)]
	public struct NCCALCSIZE_PARAMS
	{
		/// <summary>
		/// <para>Type: <b><c>RECT</c>[3]</b></para>
		/// <para>
		/// An array of rectangles. The meaning of the array of rectangles changes during the processing of the <c>WM_NCCALCSIZE</c> message.
		/// </para>
		/// <para>
		/// When the window procedure receives the <c>WM_NCCALCSIZE</c> message, the first rectangle contains the new coordinates of a
		/// window that has been moved or resized, that is, it is the proposed new window coordinates. The second contains the coordinates
		/// of the window before it was moved or resized. The third contains the coordinates of the window's client area before the window
		/// was moved or resized. If the window is a child window, the coordinates are relative to the client area of the parent window. If
		/// the window is a top-level window, the coordinates are relative to the screen origin.
		/// </para>
		/// <para>
		/// When the window procedure returns, the first rectangle contains the coordinates of the new client rectangle resulting from the
		/// move or resize. The second rectangle contains the valid destination rectangle, and the third rectangle contains the valid source
		/// rectangle. The last two rectangles are used in conjunction with the return value of the <c>WM_NCCALCSIZE</c> message to
		/// determine the area of the window to be preserved.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
		public RECT[] rgrc;

		/// <summary>
		/// <para>Type: <b>PWINDOWPOS</b></para>
		/// <para>
		/// A pointer to a <c>WINDOWPOS</c> structure that contains the size and position values specified in the operation that moved or
		/// resized the window.
		/// </para>
		/// </summary>
		public StructPointer<WINDOWPOS> lppos;

		/// <summary>Initializes a new instance of the <see cref="NCCALCSIZE_PARAMS"/> struct.</summary>
		/// <param name="rgrc">An array of rectangles.</param>
		/// <param name="lppos">
		/// A pointer to a <c>WINDOWPOS</c> structure that contains the size and position values specified in the operation that moved or
		/// resized the window.
		/// </param>
		/// <exception cref="System.ArgumentException">rgrc must be an array of 3 RECT structures.</exception>
		public NCCALCSIZE_PARAMS(RECT[] rgrc, StructPointer<WINDOWPOS> lppos)
		{
			if (rgrc is null || rgrc.Length != 3)
				throw new ArgumentException("rgrc must be an array of 3 RECT structures.");
			this.rgrc = rgrc;
			this.lppos = lppos;
		}
	}

	/// <summary>
	/// <para>Contains title bar information.</para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagtitlebarinfo typedef struct tagTITLEBARINFO { DWORD
	// cbSize; RECT rcTitleBar; DWORD rgstate[CCHILDREN_TITLEBAR + 1]; } TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;
	[PInvokeData("winuser.h", MSDNShortId = "titlebarinfo")]
	[StructLayout(LayoutKind.Sequential)]
	public struct TITLEBARINFO
	{
		/// <summary>The size, in bytes, of the structure. The caller must set this member to sizeof(TITLEBARINFO).</summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>RECT</c></para>
		/// <para>The coordinates of the title bar. These coordinates include all title-bar elements except the window menu.</para>
		/// </summary>
		public RECT rcTitleBar;

		/// <summary>
		/// <para>Type: <c>DWORD[CCHILDREN_TITLEBAR+1]</c></para>
		/// <para>
		/// An array that receives a value for each element of the title bar. The following are the title bar elements represented by the array.
		/// </para>
		/// <list type="table">
		/// <listheader>
		/// <term>Index</term>
		/// <term>Title Bar Element</term>
		/// </listheader>
		/// <item>
		/// <term>0</term>
		/// <term>The title bar itself.</term>
		/// </item>
		/// <item>
		/// <term>1</term>
		/// <term>Reserved.</term>
		/// </item>
		/// <item>
		/// <term>2</term>
		/// <term>Minimize button.</term>
		/// </item>
		/// <item>
		/// <term>3</term>
		/// <term>Maximize button.</term>
		/// </item>
		/// <item>
		/// <term>4</term>
		/// <term>Help button.</term>
		/// </item>
		/// <item>
		/// <term>5</term>
		/// <term>Close button.</term>
		/// </item>
		/// </list>
		/// <para>Each array element is a combination of one or more of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>STATE_SYSTEM_FOCUSABLE 0x00100000</term>
		/// <term>The element can accept the focus.</term>
		/// </item>
		/// <item>
		/// <term>STATE_SYSTEM_INVISIBLE 0x00008000</term>
		/// <term>The element is invisible.</term>
		/// </item>
		/// <item>
		/// <term>STATE_SYSTEM_OFFSCREEN 0x00010000</term>
		/// <term>The element has no visible representation.</term>
		/// </item>
		/// <item>
		/// <term>STATE_SYSTEM_UNAVAILABLE 0x00000001</term>
		/// <term>The element is unavailable.</term>
		/// </item>
		/// <item>
		/// <term>STATE_SYSTEM_PRESSED 0x00000008</term>
		/// <term>The element is in the pressed state.</term>
		/// </item>
		/// </list>
		/// </summary>
		[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U4, SizeConst = CCHILDREN_TITLEBAR + 1)]
		public ObjectState[] rgstate;
	}

	/// <summary>
	/// <para>
	/// Used by UpdateLayeredWindowIndirect to provide position, size, shape, content, and translucency information for a layered window.
	/// </para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagupdatelayeredwindowinfo typedef struct
	// tagUPDATELAYEREDWINDOWINFO { DWORD cbSize; HDC hdcDst; const POINT *pptDst; const SIZE *psize; HDC hdcSrc; const POINT *pptSrc;
	// COLORREF crKey; const BLENDFUNCTION *pblend; DWORD dwFlags; const RECT *prcDirty; } UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;
	[PInvokeData("winuser.h", MSDNShortId = "updatelayeredwindowinfo")]
	[StructLayout(LayoutKind.Sequential)]
	public struct UPDATELAYEREDWINDOWINFO
	{
		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The size, in bytes, of this structure.</para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>HDC</c></para>
		/// <para>
		/// A handle to a DC for the screen. This handle is obtained by specifying <c>NULL</c> in this member when calling
		/// UpdateLayeredWindowIndirect. The handle is used for palette color matching when the window contents are updated. If
		/// <c>hdcDst</c> is <c>NULL</c>, the default palette is used.
		/// </para>
		/// <para>If <c>hdcSrc</c> is <c>NULL</c>, <c>hdcDst</c> must be <c>NULL</c>.</para>
		/// </summary>
		public HDC hdcDst;

		/// <summary>
		/// <para>Type: <c>const POINT*</c></para>
		/// <para>
		/// The new screen position of the layered window. If the new position is unchanged from the current position, <c>pptDst</c> can
		/// be <c>NULL</c>.
		/// </para>
		/// </summary>
		public IntPtr pptDst;

		/// <summary>
		/// <para>Type: <c>const SIZE*</c></para>
		/// <para>
		/// The new size of the layered window. If the size of the window will not change, this parameter can be <c>NULL</c>. If
		/// <c>hdcSrc</c> is <c>NULL</c>, <c>psize</c> must be <c>NULL</c>.
		/// </para>
		/// </summary>
		public IntPtr psize;

		/// <summary>
		/// <para>Type: <c>HDC</c></para>
		/// <para>
		/// A handle to the DC for the surface that defines the layered window. This handle can be obtained by calling the
		/// CreateCompatibleDC function. If the shape and visual context of the window will not change, <c>hdcSrc</c> can be <c>NULL</c>.
		/// </para>
		/// </summary>
		public HDC hdcSrc;

		/// <summary>
		/// <para>Type: <c>const POINT*</c></para>
		/// <para>The location of the layer in the device context. If <c>hdcSrc</c> is <c>NULL</c>, <c>pptSrc</c> should be <c>NULL</c>.</para>
		/// </summary>
		public IntPtr pptSrc;

		/// <summary>
		/// <para>Type: <c>COLORREF</c></para>
		/// <para>The color key to be used when composing the layered window. To generate a COLORREF, use the RGB macro.</para>
		/// </summary>
		public COLORREF crKey;

		/// <summary>
		/// <para>Type: <c>const BLENDFUNCTION*</c></para>
		/// <para>The transparency value to be used when composing the layered window.</para>
		/// </summary>
		public IntPtr pblend;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>This parameter can be one of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>ULW_ALPHA 0x00000002</term>
		/// <term>
		/// Use pblend as the blend function. If the display mode is 256 colors or less, the effect of this value is the same as the
		/// effect of ULW_OPAQUE.
		/// </term>
		/// </item>
		/// <item>
		/// <term>ULW_COLORKEY 0x00000001</term>
		/// <term>Use crKey as the transparency color.</term>
		/// </item>
		/// <item>
		/// <term>ULW_OPAQUE 0x00000004</term>
		/// <term>Draw an opaque layered window.</term>
		/// </item>
		/// <item>
		/// <term>ULW_EX_NORESIZE 0x00000008</term>
		/// <term>
		/// Force the UpdateLayeredWindowIndirect function to fail if the current window size does not match the size specified in the psize.
		/// </term>
		/// </item>
		/// </list>
		/// <para>If <c>hdcSrc</c> is <c>NULL</c>, <c>dwFlags</c> should be zero.</para>
		/// </summary>
		public uint dwFlags;

		/// <summary>
		/// <para>Type: <c>const RECT*</c></para>
		/// <para>
		/// The area to be updated. This parameter can be <c>NULL</c>. If it is non-NULL, only the area in this rectangle is updated from
		/// the source DC.
		/// </para>
		/// </summary>
		public IntPtr prcDirty;
	}

	/// <summary>
	/// <para>Contains window information.</para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagwindowinfo typedef struct tagWINDOWINFO { DWORD cbSize;
	// RECT rcWindow; RECT rcClient; DWORD dwStyle; DWORD dwExStyle; DWORD dwWindowStatus; UINT cxWindowBorders; UINT cyWindowBorders;
	// ATOM atomWindowType; WORD wCreatorVersion; } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
	[PInvokeData("winuser.h", MSDNShortId = "windowinfo")]
	[StructLayout(LayoutKind.Sequential)]
	public struct WINDOWINFO
	{
		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The size of the structure, in bytes. The caller must set this member to .</para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>RECT</c></para>
		/// <para>The coordinates of the window.</para>
		/// </summary>
		public RECT rcWindow;

		/// <summary>
		/// <para>Type: <c>RECT</c></para>
		/// <para>The coordinates of the client area.</para>
		/// </summary>
		public RECT rcClient;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The window styles. For a table of window styles, see Window Styles.</para>
		/// </summary>
		public WindowStyles dwStyle;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>The extended window styles. For a table of extended window styles, see Extended Window Styles.</para>
		/// </summary>
		public WindowStylesEx dwExStyle;

		/// <summary>
		/// <para>Type: <c>DWORD</c></para>
		/// <para>
		/// The window status. If this member is <c>WS_ACTIVECAPTION</c> (0x0001), the window is active. Otherwise, this member is zero.
		/// </para>
		/// </summary>
		public uint dwWindowStatus;

		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>The width of the window border, in pixels.</para>
		/// </summary>
		public uint cxWindowBorders;

		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>The height of the window border, in pixels.</para>
		/// </summary>
		public uint cyWindowBorders;

		/// <summary>
		/// <para>Type: <c>ATOM</c></para>
		/// <para>The window class atom (see RegisterClass).</para>
		/// </summary>
		public ushort atomWindowType;

		/// <summary>
		/// <para>Type: <c>WORD</c></para>
		/// <para>The Windows version of the application that created the window.</para>
		/// </summary>
		public ushort wCreatorVersion;
	}

	/// <summary>
	/// <para>Contains information about the placement of a window on the screen.</para>
	/// </summary>
	/// <remarks>
	/// <para>
	/// If the window is a top-level window that does not have the <c>WS_EX_TOOLWINDOW</c> window style, then the coordinates represented
	/// by the following members are in workspace coordinates: <c>ptMinPosition</c>, <c>ptMaxPosition</c>, and <c>rcNormalPosition</c>.
	/// Otherwise, these members are in screen coordinates.
	/// </para>
	/// <para>
	/// Workspace coordinates differ from screen coordinates in that they take the locations and sizes of application toolbars (including
	/// the taskbar) into account. Workspace coordinate (0,0) is the upper-left corner of the workspace area, the area of the screen not
	/// being used by application toolbars.
	/// </para>
	/// <para>
	/// The coordinates used in a <c>WINDOWPLACEMENT</c> structure should be used only by the GetWindowPlacement and SetWindowPlacement
	/// functions. Passing workspace coordinates to functions which expect screen coordinates (such as SetWindowPos) will result in the
	/// window appearing in the wrong location. For example, if the taskbar is at the top of the screen, saving window coordinates using
	/// <c>GetWindowPlacement</c> and restoring them using <c>SetWindowPos</c> causes the window to appear to "creep" up the screen.
	/// </para>
	/// </remarks>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagwindowplacement typedef struct tagWINDOWPLACEMENT {
	// UINT length; UINT flags; UINT showCmd; POINT ptMinPosition; POINT ptMaxPosition; RECT rcNormalPosition; RECT rcDevice; } WINDOWPLACEMENT;
	[PInvokeData("winuser.h", MSDNShortId = "windowplacement")]
	[StructLayout(LayoutKind.Sequential)]
	public struct WINDOWPLACEMENT
	{
		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>
		/// The length of the structure, in bytes. Before calling the GetWindowPlacement or SetWindowPlacement functions, set this member
		/// to .
		/// </para>
		/// <para>GetWindowPlacement and SetWindowPlacement fail if this member is not set correctly.</para>
		/// </summary>
		public uint length;

		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>
		/// The flags that control the position of the minimized window and the method by which the window is restored. This member can
		/// be one or more of the following values.
		/// </para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>WPF_ASYNCWINDOWPLACEMENT 0x0004</term>
		/// <term>
		/// If the calling thread and the thread that owns the window are attached to different input queues, the system posts the
		/// request to the thread that owns the window. This prevents the calling thread from blocking its execution while other threads
		/// process the request.
		/// </term>
		/// </item>
		/// <item>
		/// <term>WPF_RESTORETOMAXIMIZED 0x0002</term>
		/// <term>
		/// The restored window will be maximized, regardless of whether it was maximized before it was minimized. This setting is only
		/// valid the next time the window is restored. It does not change the default restoration behavior. This flag is only valid when
		/// the SW_SHOWMINIMIZED value is specified for the showCmd member.
		/// </term>
		/// </item>
		/// <item>
		/// <term>WPF_SETMINPOSITION 0x0001</term>
		/// <term>
		/// The coordinates of the minimized window may be specified. This flag must be specified if the coordinates are set in the
		/// ptMinPosition member.
		/// </term>
		/// </item>
		/// </list>
		/// </summary>
		public WindowPlacementFlags flags;

		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>The current show state of the window. This member can be one of the following values.</para>
		/// <list type="table">
		/// <listheader>
		/// <term>Value</term>
		/// <term>Meaning</term>
		/// </listheader>
		/// <item>
		/// <term>SW_HIDE 0</term>
		/// <term>Hides the window and activates another window.</term>
		/// </item>
		/// <item>
		/// <term>SW_MAXIMIZE 3</term>
		/// <term>Maximizes the specified window.</term>
		/// </item>
		/// <item>
		/// <term>SW_MINIMIZE 6</term>
		/// <term>Minimizes the specified window and activates the next top-level window in the z-order.</term>
		/// </item>
		/// <item>
		/// <term>SW_RESTORE 9</term>
		/// <term>
		/// Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and
		/// position. An application should specify this flag when restoring a minimized window.
		/// </term>
		/// </item>
		/// <item>
		/// <term>SW_SHOW 5</term>
		/// <term>Activates the window and displays it in its current size and position.</term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWMAXIMIZED 3</term>
		/// <term>Activates the window and displays it as a maximized window.</term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWMINIMIZED 2</term>
		/// <term>Activates the window and displays it as a minimized window.</term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWMINNOACTIVE 7</term>
		/// <term>Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.</term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWNA 8</term>
		/// <term>Displays the window in its current size and position. This value is similar to SW_SHOW, except the window is not activated.</term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWNOACTIVATE 4</term>
		/// <term>
		/// Displays a window in its most recent size and position. This value is similar to SW_SHOWNORMAL, except the window is not activated.
		/// </term>
		/// </item>
		/// <item>
		/// <term>SW_SHOWNORMAL 1</term>
		/// <term>
		/// Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and
		/// position. An application should specify this flag when displaying the window for the first time.
		/// </term>
		/// </item>
		/// </list>
		/// </summary>
		public ShowWindowCommand showCmd;

		/// <summary>
		/// <para>Type: <c>POINT</c></para>
		/// <para>The coordinates of the window's upper-left corner when the window is minimized.</para>
		/// </summary>
		public POINT ptMinPosition;

		/// <summary>
		/// <para>Type: <c>POINT</c></para>
		/// <para>The coordinates of the window's upper-left corner when the window is maximized.</para>
		/// </summary>
		public POINT ptMaxPosition;

		/// <summary>
		/// <para>Type: <c>RECT</c></para>
		/// <para>The window's coordinates when the window is in the restored position.</para>
		/// </summary>
		public RECT rcNormalPosition;

#if _MAC
		/// <summary/>
		public RECT rcDevice;
#endif
	}

	/// <summary>
	/// <para>Contains the window class attributes that are registered by the RegisterClass function.</para>
	/// <para>
	/// This structure has been superseded by the WNDCLASSEX structure used with the RegisterClassEx function. You can still use
	/// <c>WNDCLASS</c> and RegisterClass if you do not need to set the small icon associated with the window class.
	/// </para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagwndclassa typedef struct tagWNDCLASSA { UINT style;
	// WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground;
	// LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct WNDCLASS
	{
		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>The class style(s). This member can be any combination of the Class Styles.</para>
		/// </summary>
		public WindowClassStyles style;

		/// <summary>
		/// <para>Type: <c>WNDPROC</c></para>
		/// <para>
		/// A pointer to the window procedure. You must use the CallWindowProc function to call the window procedure. For more
		/// information, see WindowProc.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.FunctionPtr)]
		public WindowProc lpfnWndProc;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The number of extra bytes to allocate following the window-class structure. The system initializes the bytes to zero.</para>
		/// </summary>
		public int cbClsExtra;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The number of extra bytes to allocate following the window instance. The system initializes the bytes to zero. If an
		/// application uses <c>WNDCLASS</c> to register a dialog box created by using the <c>CLASS</c> directive in the resource file,
		/// it must set this member to <c>DLGWINDOWEXTRA</c>.
		/// </para>
		/// </summary>
		public int cbWndExtra;

		/// <summary>
		/// <para>Type: <c>HINSTANCE</c></para>
		/// <para>A handle to the instance that contains the window procedure for the class.</para>
		/// </summary>
		public HINSTANCE hInstance;

		/// <summary>
		/// <para>Type: <c>HICON</c></para>
		/// <para>
		/// A handle to the class icon. This member must be a handle to an icon resource. If this member is <c>NULL</c>, the system
		/// provides a default icon.
		/// </para>
		/// </summary>
		public HICON hIcon;

		/// <summary>
		/// <para>Type: <c>HCURSOR</c></para>
		/// <para>
		/// A handle to the class cursor. This member must be a handle to a cursor resource. If this member is <c>NULL</c>, an
		/// application must explicitly set the cursor shape whenever the mouse moves into the application's window.
		/// </para>
		/// </summary>
		public HCURSOR hCursor;

		/// <summary>
		/// <para>Type: <c>HBRUSH</c></para>
		/// <para>
		/// A handle to the class background brush. This member can be a handle to the physical brush to be used for painting the
		/// background, or it can be a color value. A color value must be one of the following standard system colors (the value 1 must
		/// be added to the chosen color found in <see cref="SystemColorIndex"/>). If a color value is given, you must convert it to one
		/// of the following <c>HBRUSH</c> types:
		/// </para>
		/// <list type="bullet">
		/// <item>
		/// <term>COLOR_ACTIVEBORDER</term>
		/// </item>
		/// <item>
		/// <term>COLOR_ACTIVECAPTION</term>
		/// </item>
		/// <item>
		/// <term>COLOR_APPWORKSPACE</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BACKGROUND</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNFACE</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNSHADOW</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_CAPTIONTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_GRAYTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_HIGHLIGHT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_HIGHLIGHTTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_INACTIVEBORDER</term>
		/// </item>
		/// <item>
		/// <term>COLOR_INACTIVECAPTION</term>
		/// </item>
		/// <item>
		/// <term>COLOR_MENU</term>
		/// </item>
		/// <item>
		/// <term>COLOR_MENUTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_SCROLLBAR</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOW</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOWFRAME</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOWTEXT</term>
		/// </item>
		/// </list>
		/// <para>The system automatically deletes class background brushes when the class is unregistered by using</para>
		/// <para>UnregisterClass</para>
		/// <para>. An application should not delete these brushes.</para>
		/// <para>
		/// When this member is <c>NULL</c>, an application must paint its own background whenever it is requested to paint in its
		/// client area. To determine whether the background must be painted, an application can either process the WM_ERASEBKGND
		/// message or test the <c>fErase</c> member of the PAINTSTRUCT structure filled by the BeginPaint function.
		/// </para>
		/// </summary>
		public HBRUSH hbrBackground;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>
		/// The resource name of the class menu, as the name appears in the resource file. If you use an integer to identify the menu,
		/// use the MAKEINTRESOURCE macro. If this member is <c>NULL</c>, windows belonging to this class have no default menu.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string lpszMenuName;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>
		/// A pointer to a null-terminated string or is an atom. If this parameter is an atom, it must be a class atom created by a
		/// previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of
		/// <c>lpszClassName</c>; the high-order word must be zero.
		/// </para>
		/// <para>
		/// If <c>lpszClassName</c> is a string, it specifies the window class name. The class name can be any name registered with
		/// RegisterClass or RegisterClassEx, or any of the predefined control-class names.
		/// </para>
		/// <para>
		/// The maximum length for <c>lpszClassName</c> is 256. If <c>lpszClassName</c> is greater than the maximum length, the
		/// RegisterClass function will fail.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string lpszClassName;
	}

	/// <summary>
	/// <para>Contains window class information. It is used with the RegisterClassEx and GetClassInfoEx functions.</para>
	/// <para>
	/// The <c>WNDCLASSEX</c> structure is similar to the WNDCLASS structure. There are two differences. <c>WNDCLASSEX</c> includes the
	/// <c>cbSize</c> member, which specifies the size of the structure, and the <c>hIconSm</c> member, which contains a handle to a
	/// small icon associated with the window class.
	/// </para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagwndclassexa typedef struct tagWNDCLASSEXA { UINT
	// cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH
	// hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; HICON hIconSm; } WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	public struct WNDCLASSEX
	{
		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>
		/// The size, in bytes, of this structure. Set this member to <c>sizeof(WNDCLASSEX)</c>. Be sure to set this member before calling the GetClassInfoEx function.
		/// </para>
		/// </summary>
		public uint cbSize;

		/// <summary>
		/// <para>Type: <c>UINT</c></para>
		/// <para>The class style(s). This member can be any combination of the Class Styles.</para>
		/// </summary>
		public WindowClassStyles style;

		/// <summary>
		/// <para>Type: <c>WNDPROC</c></para>
		/// <para>
		/// A pointer to the window procedure. You must use the CallWindowProc function to call the window procedure. For more
		/// information, see WindowProc.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.FunctionPtr)]
		public WindowProc? lpfnWndProc;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>The number of extra bytes to allocate following the window-class structure. The system initializes the bytes to zero.</para>
		/// </summary>
		public int cbClsExtra;

		/// <summary>
		/// <para>Type: <c>int</c></para>
		/// <para>
		/// The number of extra bytes to allocate following the window instance. The system initializes the bytes to zero. If an
		/// application uses <c>WNDCLASSEX</c> to register a dialog box created by using the <c>CLASS</c> directive in the resource file,
		/// it must set this member to <c>DLGWINDOWEXTRA</c>.
		/// </para>
		/// </summary>
		public int cbWndExtra;

		/// <summary>
		/// <para>Type: <c>HINSTANCE</c></para>
		/// <para>A handle to the instance that contains the window procedure for the class.</para>
		/// </summary>
		public HINSTANCE hInstance;

		/// <summary>
		/// <para>Type: <c>HICON</c></para>
		/// <para>
		/// A handle to the class icon. This member must be a handle to an icon resource. If this member is <c>NULL</c>, the system
		/// provides a default icon.
		/// </para>
		/// </summary>
		public HICON hIcon;

		/// <summary>
		/// <para>Type: <c>HCURSOR</c></para>
		/// <para>
		/// A handle to the class cursor. This member must be a handle to a cursor resource. If this member is <c>NULL</c>, an
		/// application must explicitly set the cursor shape whenever the mouse moves into the application's window.
		/// </para>
		/// </summary>
		public HCURSOR hCursor;

		/// <summary>
		/// <para>Type: <c>HBRUSH</c></para>
		/// <para>
		/// A handle to the class background brush. This member can be a handle to the brush to be used for painting the background, or
		/// it can be a color value. A color value must be one of the following standard system colors (the value 1 must be added to the
		/// chosen color). If a color value is given, you must convert it to one of the following <c>HBRUSH</c> types:
		/// </para>
		/// <list type="bullet">
		/// <item>
		/// <term>COLOR_ACTIVEBORDER</term>
		/// </item>
		/// <item>
		/// <term>COLOR_ACTIVECAPTION</term>
		/// </item>
		/// <item>
		/// <term>COLOR_APPWORKSPACE</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BACKGROUND</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNFACE</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNSHADOW</term>
		/// </item>
		/// <item>
		/// <term>COLOR_BTNTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_CAPTIONTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_GRAYTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_HIGHLIGHT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_HIGHLIGHTTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_INACTIVEBORDER</term>
		/// </item>
		/// <item>
		/// <term>COLOR_INACTIVECAPTION</term>
		/// </item>
		/// <item>
		/// <term>COLOR_MENU</term>
		/// </item>
		/// <item>
		/// <term>COLOR_MENUTEXT</term>
		/// </item>
		/// <item>
		/// <term>COLOR_SCROLLBAR</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOW</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOWFRAME</term>
		/// </item>
		/// <item>
		/// <term>COLOR_WINDOWTEXT</term>
		/// </item>
		/// </list>
		/// <para>The system automatically deletes class background brushes when the class is unregistered by using</para>
		/// <para>UnregisterClass</para>
		/// <para>. An application should not delete these brushes.</para>
		/// <para>
		/// When this member is <c>NULL</c>, an application must paint its own background whenever it is requested to paint in its client
		/// area. To determine whether the background must be painted, an application can either process the WM_ERASEBKGND message or
		/// test the <c>fErase</c> member of the PAINTSTRUCT structure filled by the BeginPaint function.
		/// </para>
		/// </summary>
		public HBRUSH hbrBackground;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>
		/// Pointer to a null-terminated character string that specifies the resource name of the class menu, as the name appears in the
		/// resource file. If you use an integer to identify the menu, use the MAKEINTRESOURCE macro. If this member is <c>NULL</c>,
		/// windows belonging to this class have no default menu.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string? lpszMenuName;

		/// <summary>
		/// <para>Type: <c>LPCTSTR</c></para>
		/// <para>
		/// A pointer to a null-terminated string or is an atom. If this parameter is an atom, it must be a class atom created by a
		/// previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of
		/// <c>lpszClassName</c>; the high-order word must be zero.
		/// </para>
		/// <para>
		/// If <c>lpszClassName</c> is a string, it specifies the window class name. The class name can be any name registered with
		/// RegisterClass or RegisterClassEx, or any of the predefined control-class names.
		/// </para>
		/// <para>
		/// The maximum length for <c>lpszClassName</c> is 256. If <c>lpszClassName</c> is greater than the maximum length, the
		/// RegisterClassEx function will fail.
		/// </para>
		/// </summary>
		[MarshalAs(UnmanagedType.LPTStr)]
		public string lpszClassName;

		/// <summary>
		/// <para>Type: <c>HICON</c></para>
		/// <para>
		/// A handle to a small icon that is associated with the window class. If this member is <c>NULL</c>, the system searches the
		/// icon resource specified by the <c>hIcon</c> member for an icon of the appropriate size to use as the small icon.
		/// </para>
		/// </summary>
		public HICON hIconSm;
	}

	/// <summary>
	/// <para>Contains window class information. It is used with the RegisterClassEx and GetClassInfoEx functions.</para>
	/// <para>
	/// The <c>WNDCLASSEX</c> structure is similar to the WNDCLASS structure. There are two differences. <c>WNDCLASSEX</c> includes the
	/// <c>cbSize</c> member, which specifies the size of the structure, and the <c>hIconSm</c> member, which contains a handle to a
	/// small icon associated with the window class.
	/// </para>
	/// </summary>
	// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagwndclassexa typedef struct tagWNDCLASSEXA { UINT
	// cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH
	// hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; HICON hIconSm; } WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;
	[PInvokeData("winuser.h", MSDNShortId = "")]
	[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
	private struct WNDCLASSEXB
	{
		public uint cbSize;

		public WindowClassStyles style;

		[MarshalAs(UnmanagedType.FunctionPtr)]
		public WindowProc? lpfnWndProc;

		public int cbClsExtra;

		public int cbWndExtra;

		public HINSTANCE hInstance;

		public HICON hIcon;

		public HCURSOR hCursor;

		public HBRUSH hbrBackground;

		public StrPtrAuto lpszMenuName;

		public StrPtrAuto lpszClassName;

		public HICON hIconSm;

		public WNDCLASSEXB() => cbSize = (uint)Marshal.SizeOf(typeof(WNDCLASSEXB));

		public static implicit operator WNDCLASSEX(WNDCLASSEXB wc) => new()
		{
			cbSize = wc.cbSize,
			style = wc.style,
			lpszMenuName = wc.lpszMenuName,
			lpszClassName = ((string?)wc.lpszClassName) ?? "",
			hIconSm = wc.hIconSm,
			hCursor = wc.hCursor,
			hbrBackground = wc.hbrBackground,
			hIcon = wc.hIcon,
			hInstance = wc.hInstance,
			cbClsExtra = wc.cbClsExtra,
			cbWndExtra = wc.cbWndExtra,
			lpfnWndProc = wc.lpfnWndProc,
		};
	}

	/// <summary>
	/// Provides a <see cref="SafeHandle"/> to a window or dialog that releases a created HWND instance at disposal using DestroyWindow.
	/// </summary>
	[AutoSafeHandle(null, typeof(HWND))]
	public partial class SafeHWND : IUserHandle
	{
		/// <inheritdoc/>
		protected override bool InternalReleaseHandle()
		{
			var hp = GetAncestor(this, GetAncestorFlag.GA_ROOT);
			if (hp != this) return true;
			return DestroyWindow(this);
		}
	}

	/*GET_APPCOMMAND_LPARAM macro
	GET_DEVICE_LPARAM macro
	GET_FLAGS_LPARAM macro
	GET_KEYSTATE_LPARAM macro
	GET_KEYSTATE_WPARAM macro
	GET_NCHITTEST_WPARAM macro
	GET_RAWINPUT_CODE_WPARAM macro
	GET_WHEEL_DELTA_WPARAM macro
	GET_XBUTTON_WPARAM macro*/
}